根据模板参数包的大小编译时间代码生成

时间:2016-04-25 18:18:56

标签: c++ c++11 c++14

我有以下代码:

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 ++中有没有解决方法?

2 个答案:

答案 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) ...