c++ - 如何在模板参数中分离函数类型返回类型和参数
问题描述
我想将函数类型(例如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
像我期望的那样。这是现场样品。
我以前见过这样的模板诡计,它实际上以某种方式起作用。我已经在 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};
}
};
推荐阅读
- haskell - 图书馆:“vector-0.12.0.2:高效数组”
- c# - 使用 c# 使用 gsm modam 发送短信,消息长度太短
- forms - 使用唯一键号 Firebase 存储数据库
- amazon-web-services - 从 CloudTrail S3 存储桶获取对象时 S3 访问被拒绝
- javascript - 是否可以使用 javascript 实时检查 window.variable 对象
- javascript - Amcharts:更改整个数据集
- scikit-learn - 使用类权重的网格搜索和 KerasClassifier
- arrays - 获取 ruby 数组中特定模式的出现次数
- node.js - 通过浏览器上的 node.js 将音频流式传输到 Azure 语音 api
- mysql - 从其他人的项目迁移时如何修复“Django:表不存在”?