C++预处理器
C++ preprocessor
我想有条件地包括函数(特别是构造函数),这取决于我在预处理器级别上定义的变量类型,例如
#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。尝试过之后,我想知道为什么我会写这样的代码。漂亮是另一回事。
相关文章:
- 错误:无效的预处理指令 #i 的意思是 #if?
- C++预处理会生成变量成员、资源库和映射
- 使用预处理指令检查是否包含标头?
- 预处理的 C/C++ 文件是否特定于计算机?
- 使用 GCC 对 C 文件进行部分预处理(不删除 "define" 指令)
- 在 CPLEX 中求解线性规划,无需剪切和预处理
- CPP -D 选项,用于预处理 Fortran 代码
- 错误:粘贴"tmp_UINT"和"+"未提供有效的预处理令牌
- 任务计划程序库的预处理不起作用 - 多定义错误
- Eclipse 问题 - 编译期间不考虑 .c 和 .cpp 文件中定义的预处理
- 使用python预处理后,C++(opencv)中的垫子类型数据与image_to_array相同
- Howo 使用 cl 预处理为 masm 组装生成一个单独的文件
- 我有一个预处理的 C/C++ 源文件 (cacti.i).如何从这个 .i 文件生成可执行二进制文件,以便我可以像 ./
- 如何使用Visual Studio C/C++编译器(cl.exe)来预处理我的objective-C代码
- 是具有预处理前分支实现的结构违反ODR
- 与不完整的Cholesky预处理的共轭梯度返回特征库的意外错误
- Visual Studio C - 无法输出预处理文件
- 在海湾合作委员会中加快宏观预处理的任何方法
- 所有结构成员的预处理器批处理
- 当头文件被预处理时是否有一个预处理器选项显示?