2016-04-25 174 views
-3

我有以下的代码:编译时代码生成

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

“使得编译器在sizeof ...(args)== 0'的情况下不生成代码”如果(优化的)版本为此生成代码,请向供应商提交错误。 –

+0

对不起,我生成了调试配置的代码。 –

+0

你*可以*使用多态lambda表达式实现某种内联标签分派:[example](http://coliru.stacked-crooked.com/a/616a698807b2148f)。如果您查看[生成的代码](https://godbolt.org/g/20EFoS),即使在-O0,也不会出现从未采取的“分支”。虽然我认为人类阅读器和编译器都可以通过常规标签发送或SFINAE方法轻松实现:) – melak47

回答

1

您可以随时使用std::enable_if

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

在这种情况下,func只会出现设置过载的部分如果ARGS...的大小大于0。但是,如果大小为零,你将会丢失超载设置的功能。不过,也许这就是你想要的。

+0

当ARGS ...的大小为0时,我将不得不添加一个过载情况,这正是我所知询问是否可以避免,即使是新的C++标准。正如T.C.在优化版本中,编译器不会生成那部分代码。 –

+0

是的,您需要指定一个可以处理有效用例的重载集。或者/你需要依靠编译时优化。两者都完全可以接受,并且是生成优化代码的不同方式。 Modern C++提供了更简单的方法来实现前者,但它并没有消除函数定义必须可用于调用它的参数的基本需求。 – KyleKnoepfel

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