C++预处理器

C++ preprocessor

本文关键字:处理器 预处理 C++      更新时间:2023-10-16

我想有条件地包括函数(特别是构造函数),这取决于我在预处理器级别上定义的变量类型,例如

#define my_type double

在任何时候,我都可以有条件地包含一个函数

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

这很好用。但是,如果要将模板化类型指定给my_type,该如何执行此操作。例如,使用复杂的替身,我会天真地认为

#if my_type == complex<double>

会起作用,但预处理器似乎将最后一个">"解释为预处理器级别的运算符。我看不到使用typedefs的方法,因为我希望预处理器执行条件包含。当然,我可以对我的整个类进行模板化,避免使用预处理器来完成这项任务,但我目前非常不愿意这样做。此外,除了类型之外,还可以定义另一个预处理器标志,但这似乎相当肮脏。

#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

我很惊讶my_type == double能工作;它绝对不应该。预处理器只能计算简单的数字表达式。

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

像这样的成熟模板怎么样

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

并且,您称为:CCD_ 4、CCD_ 5等以传入用于适当模板实例化的数据类型。

类似@Debasish Jana的想法:用作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。尝试过之后,我想知道为什么我会写这样的代码。漂亮是另一回事。