Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 基于模板参数包大小的编译时代码生成_C++_C++11_C++14 - Fatal编程技术网

C++ 基于模板参数包大小的编译时代码生成

C++ 基于模板参数包大小的编译时代码生成,c++,c++11,c++14,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)

我有以下代码:

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;
    }
}
模板
void func(const my_type&set,std::of stream t_print,std::of stream args_print){

t\u print如果
,则始终可以使用
std::enable\u:

template <typename T, typename ... ARGS>
std::enable_if_t<(sizeof...(ARGS)>0)> func(...) { ... }
模板
std::enable_if_t0)>func(…){…}

在这种情况下,
func
仅在
ARGS…
的大小大于0时才会作为重载集的一部分出现。但是,如果大小为零,则重载集中会缺少一个函数。不过,这可能是您想要的。

有一个实用的、不模糊的技巧,包括拥有包只是后来

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;
}
模板
void func(const my_type&set,std::of stream t_print,std::of stream args_print){

t_print“使编译器在
sizeof…(args)==0的情况下不生成代码”如果(优化的)版本生成代码,请向您的供应商提交一个错误。很抱歉,我生成了用于调试配置的代码。您可以使用多态lambda实现某种类型的内联标记分派:。如果您查看,甚至是-O0“分支"虽然我认为人类读者和编译器都有一个更容易的时间,用常规的标签调度或SFIEAE方法:)当AGs的大小为0时,我必须增加一个过载,这正是我所要求的,即使是在新的C++标准中,也可以避免。正如T.C.评论的,在优化中。版本编译器不生成代码的一部分。是的,您需要指定一个可以处理有效用例的过载集。或者/您需要依赖编译时优化。这两种方法都是完全可以接受的,并且是生成优化代码的不同方式。C++提供了更简单的实现前者的方法,但是t并没有消除函数定义必须可用于调用它的参数这一基本需求。