【发布时间】:2017-10-02 21:04:25
【问题描述】:
给定两个或更多示例函数,是否可以编写模板化代码来推断作为模板参数提供的函数的参数?
这是一个鼓舞人心的例子:
void do_something(int value, double amount) {
std::cout << (value * amount) << std::endl;
}
void do_something_else(std::string const& first, double & second, int third) {
for(char c : first)
if(third / c == 0)
second += 13.7;
}
template<void(*Func)(/*???*/)>
struct wrapper {
using Args = /*???*/;
void operator()(Args&& ... args) const {
Func(std::forward<Args>(args)...);
}
};
int main() {
wrapper<do_something> obj; //Should be able to deduce Args to be [int, double]
obj(5, 17.4); //Would call do_something(5, 17.4);
wrapper<do_something_else> obj2; //Should be able to deduce Args to be [std::string const&, double&, int]
double value = 5;
obj2("Hello there!", value, 70); //Would call do_something_else("Hello there!", value, 70);
}
在/*???*/ 的两种用法中,我都在尝试找出我可以放在那里以启用这种代码的内容。
以下似乎不起作用,因为Args 在第一次使用之前没有被定义(除了我必须假设还有许多语法错误),即使它确实如此,我仍在寻找对于不需要显式编写类型本身的版本:
template<void(*Func)(Args ...), typename ... Args)
struct wrapper {
void operator()(Args ...args) const {
Func(std::forward<Args>(args)...);
}
};
wrapper<do_something, int, double> obj;
【问题讨论】:
-
你的意思是std::function?
-
@bolov 我正在寻找的具体方法是从提供的
Function中推断出Args。std::function通过在类型参数列表中明确指定这些类型来匹配函数指针。 -
你接受 C++17 吗?眨眼眨眼
-
@bolov 我正在使用 MSVC,所以我使用 C++17 的能力受到微软编译器实现质量的限制,但如果存在专门的 C++17 解决方案,我会很高兴看到它。
-
请问当您可以直接致电
do_something或do_something_else时,拥有这样的包装器有什么好处?将指向函数的指针存储为模板参数似乎没有用。此外,如果您不想编写类型,可以利用decltype将第一个模板参数声明为指向方法的指针,然后将指针值作为第二个参数传递。
标签: c++ templates template-meta-programming