2014-11-06 81 views
2

根据我在预处理程序的层次上定义的变量类型,我想有条件地包含函数(或特别是构造函数),例如,C++预处理程序

#define my_type double 

,并在任何时候我可以有条件地包括功能

#if my_type == double 
void my_fct(); 
#endif 

工作正常。但是,如果我想将模板类型分配给my_type,我该如何执行此操作。使用复杂的双重例如,我天真地以为大道

#if my_type == complex<double> 

会的工作,但似乎预处理来解释过去的“>”作为预处理器级别的运营商。 我没有看到使用typedefs的方法,因为我希望预处理器执行条件包含。 当然,我可以模板我的整个班级,避免使用预处理器来完成这个任务,但我现在非常不愿意。另外,除了类型之外,还可以定义另一个预处理器标志,但这看起来很脏。

+0

你知道,如果你愿意,你可以使一个函数成为一个模板而不是整个类。 – icabod 2014-11-06 12:45:26

+0

我完全不同意你最后的解决方案“看起来很脏”。对类型别名使用typedefs,对条件代码使用预处理器。 – molbdnilo 2014-11-06 12:47:24

回答

8

#if my_type == double不测试您是否已完成#define my_type double。事实上它永远是真的。

在预处理算法只能使用整型常量表达式,所以你必须设置一些像:

// from your makefile or whatever 
#define MY_TYPE MY_DOUBLE 

...

// in header file 
#define MY_INT 3 
#define MY_DOUBLE 4 
#define MY_COMPLEX_DOUBLE 5 

#if MY_TYPE == MY_DOUBLE 
    typedef double my_type; 
#elif MY_TYPE == MY_INT 
    typedef int my_type; 
#elif MY_TYPE == MY_COMPLEX_DOUBLE 
    typedef complex<double> my_type; 
#endif 
1

我非常惊讶的是my_type == double作品;它绝对不应该。预处理器只能评估简单的数字表达式。

所以答案是否定的,你不能使用模板类型(预处理器不知道类型,它只是做令牌替换)。如果您需要类型级别的逻辑,则需要模板。

+2

它“工作”,因为字母数字标记被替换为“0”的算术,所以这个测试是否为'0 == 0' – 2014-11-06 12:46:33

+0

@MattMcNabb不知道,有趣。我猜这是为了'#if MY_FEATURE_DEFINE == 1'起作用? – 2014-11-06 13:48:35

+0

可能..有很多代码使用它(例如'#if __cplusplus> 20110101') – 2014-11-06 21:12:53

0

什么像一个完全成熟的模板:

template <class T> 
void my_fct() { 
// your code based on T as a type 
} 

而且,你叫为: my_fct<int>my_fct<double>等在相应的模板实例化的数据类型来传递。

+0

感谢您的建议。这对于一个正常的功能来说确实很好,但对我来说不是这样。我以一种误导的方式阐述了我的例子:我有条件地希望根据数据类型包含不同的类的构造函数,因为某些投射操作不能自动工作。但它应该与上面建议的方法一起工作。再次感谢! – ulf 2014-11-06 16:31:33

0

类似的想法,@ Debasish - 贾纳:用作typtdef和模板功能,这是一个有点难看:

type typedef double my_type; 

而且对于double情况下的函数:

template<typename T = my_type> 
typename std::enable_if<std::is_same<T,double>::value, void>::type 
cnt() 
{ 

} 

而另一或cmplex编号:

template<typename T = my_type> 
typename std::enable_if<std::is_same<T,std::complex<double>>::value, void>::type 
cnt() 
{ 

} 

一个例子是这里:https://ideone.com/aXupSa。 试过这个,我想知道为什么我会这样写代码。漂亮又漂亮是另一回事。