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

Compile time code generation based on the size of template parameter pack

本文关键字:编译 参数      更新时间:2023-10-16

我有以下一段代码:

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