我有以下代码:
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 ++中有没有解决方法?
答案 0 :(得分:1)
您始终可以使用std::enable_if
:
template <typename T, typename ... ARGS>
std::enable_if_t<(sizeof...(ARGS)>0)> func(...) { ... }
在这种情况下,如果func
的大小大于0,ARGS...
将仅作为重载集的一部分出现。但是,如果大小为零,则您将缺少函数你的过载设置。也许那就是你想要的。
答案 1 :(得分:1)
这是一个务实的,没有混淆的技巧,其中包括稍后才打包
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) ...
。