将variadic模板功能转换为许多具体功能
Convert Variadic Template Function to many concrete functions
是否有编译器标志或技术来强制每个呼叫的一个非variadic函数生成具有唯一签名的变异功能模板?
在以下示例中,编译器使用签名int (int, float, double)
,int (float, double)
和int (double)
。
#include <iostream>
using namespace std;
template<class IntT, class argsf>
IntT SumArgs(const argsf& firstArg)
{
return static_cast<IntT>(firstArg);
}
template<class IntT, class argsf, class ...argst>
IntT SumArgs(const argsf& firstArg, const argst&... restArgs)
{
return static_cast<IntT>(firstArg + SumArgs<IntT>(restArgs...));
}
int main()
{
cout<<"Sum result: " << SumArgs<int>(1, 2.f, 3.5);
return 0;
}
前两个仍然是变异。但是,在某些情况下,可能需要避免variadic函数的开销,而是为上面列出的每个签名创建一个唯一的函数定义。有没有办法让编译器这样做?替代方法是编写明确使用0、1、2 ... n参数的功能版本,用于一些合理的n,并手工重复代码,但理想情况下,编译器可以为我们做这个重型。
c 17引入了折叠表达式(希望(您正在寻找的内容:
template <class R, class... Args>
constexpr R SumArgs(const Args&... args)
{
return static_cast<R>((args + ...)); // fold expression
}
如果您不想使用variadic模板,则可以使用initializer_list
:
template <class R, class T>
constexpr R SumArgs(std::initializer_list<T> args)
{
return std::accumulate(args.begin(), args.end(), R{});
}
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 多态性和功能结合
- 带内存和隔离功能的SQLite
- 在CMakeLists.txt的安装功能中使用.cmake文件有什么用
- 类模板的成员功能的定义在单独的TU中完全专业化
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何在C++中获得"静态纯虚拟"功能?
- 在混合代码库中将C转换为C++时出现许多包含错误
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数
- 两个文件使用彼此的功能-如何解决
- 我应该实现右值推送功能吗?我应该使用std::move吗
- QML按钮点击功能执行顺序
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 有没有可能有一个只有ADL才能找到的非好友功能
- 将variadic模板功能转换为许多具体功能
- C 呼叫功能具有许多不同类型
- 如果链表比数组具有许多功能优势,那么数组与链表相比有什么优势?
- 如何在许多功能中使用相同的多维数组
- 我正在使用Xcode进行c ++编程和学习。为什么我不能在一个项目中放置许多具有 MAIN 功能的单独源文件?
- C++11:is_member_pointer不适用于许多 STL 容器功能