根据模板参数包的大小生成编译时码
Compile time code generation based on the size of template parameter pack
我有以下一段代码:
template<typename T, typename... args>
void func(const my_type<T, args...>& set, std::ofstream t_print, std::ofstream args_print) {
t_print << set.get_t() << std::endl;
if (sizeof...(args) > 0)
data << set.get_args() << std::endl;
}
}
if
条件的计算推迟到运行时,编译器为if
正文生成代码。我的问题是,是否有办法使编译器在sizeof...(args) == 0
的情况下不会生成代码,而无需使用模板专用化技术。现代C++中是否有任何解决方法?
您可以随时使用 std::enable_if
:
template <typename T, typename ... ARGS>
std::enable_if_t<(sizeof...(ARGS)>0)> func(...) { ... }
在这种情况下,仅当 ARGS...
的大小大于 0 时,func
才会显示为重载集的一部分。 但是,如果大小为零,则重载集中将缺少一个函数。 不过,也许这就是你想要的。
有一个实用的、不混淆的技巧,它包括稍后才拥有包
template<typename T, typename arg, typename... args>
void func(const my_type<T, arg, args...>& set, std::ofstream t_print, std::ofstream args_print) {
t_print << set.get_t() << std::endl;
data << set.get_args() << std::endl;
}
但是,如果您认为这样做是一种"优化",请立即停止。然后,您还应该担心直接在汇编中使用C++和编程。哦,停止,您应该首先阅读英特尔开发人员手册,以比编译器的代码生成更了解您的 CPU,以便获得回报。
底线 - 只是不要担心这个级别的性能。"未启用优化"并不意味着"生成哑代码"。即使禁用了优化,任何半体面的编译器也不会发出if(0) ...
。
相关文章:
- 非类型指针和引用模板参数,以及在编译时如何/为什么解析它们.c++
- 根据编译时参数在 C 中重复代码
- 使用 SFINAE 作为模板参数的编译时递归
- 使用带有 ref 参数的成员函数创建线程时出现编译错误
- 使用 std::enable_if 限制派生类的模板参数时出现编译错误
- 带有自动参数的函数使用 GCC 编译,但不使用 Visual C++ 编译
- 为什么我的递归可变参数模板无法编译?
- 知道模板参数在编译时是否为 const char*?
- 可变参数模板未在 MSVC 中编译?
- 将函数类型作为模板参数传递不会编译
- 线程构造函数周围的可变参数模板包装器无法编译
- 编译错误:临时对象构造函数中缺少参数
- 在编译时收集模板参数
- 有没有办法根据命令行参数定义数组大小?运行时与编译时实例化?
- C++模板-基于参数编译成员函数
- C++编译时检查是否可以用某种类型的参数调用重载函数
- Visual Studio代码:C 编译参数-O
- Clang 无法使用模板元编程编译参数包扩展
- 如何更改和设置Rcpp编译参数
- Jamfile的可移植编译参数