我想将函数类型(例如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。
我以前见过像这样的模板骗术,它实际上以某种方式起作用。我已经看到了很多有关如何执行此操作的答案,但这需要有效的函数指针。在这里,我直接指定函数类型,因此decltype
解决方案似乎不适用于此处。
我该如何完成?我的解决方案最多可以使用C ++ 17。
答案 0 :(得分:4)
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};
}
};