我想将函数类型(例如 int(float)
)传递给将返回类型与变量参数列表分开的类模板:
template<typename R, typename... Args>
class CallFunction
{
public:
R operator()(Args&&... args)
{
std::cout << ("" << ... << (args << "\n"));
return R{100};
}
};
int main()
{
CallFunction<int(float)> cf;
std::cout << "return value: " << cf(200.f) << "\n";
}
我意识到上面的代码不起作用。在这种情况下,R
等于 int(float)
而不是像我期望的那样只是 int
。这是 live sample .
我以前见过这样的模板欺骗,它确实以某种方式起作用。我已经在 SO 上看到很多关于如何执行此操作的答案,但它需要一个有效的函数指针。在这里,我直接指定了函数类型,所以decltype
解决方案在这里似乎并不适用。
我怎样才能做到这一点?我的解决方案最多可以使用 C++17。
最佳答案
int(float)
是单一类型(特别是函数类型),因此您的模板只需要采用一种类型。但随后您可以使用部分特化来推导返回类型和参数类型。
template <typename>
class CallFunction; // This primary template is not defined.
template <typename R, typename... Args>
class CallFunction<R(Args...)>
{
public:
R operator()(Args&&... args)
{
std::cout << ("" << ... << (args << "\n"));
return R{100};
}
};
关于c++ - 如何在模板参数中分离函数类型返回类型和参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58458812/