首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++预处理器

问C++预处理器
EN

Stack Overflow用户
提问于 2014-11-06 12:39:03
回答 4查看 170关注 0票数 2

我希望有条件地包含函数(或者特别是构造函数),这取决于我在预处理程序级别上定义的变量类型。

代码语言:javascript
复制
#define my_type double

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

代码语言:javascript
复制
#if my_type == double
void my_fct();
#endif

效果很好。但是,如果要将模板类型分配给my_type,如何做到这一点。例如,使用复杂的双,我会天真地认为

代码语言:javascript
复制
#if my_type == complex<double>

可以工作,但预处理程序似乎将最后一个">“解释为预处理级别上的操作符。我没有看到一种使用类型防御的方法,因为我希望预处理程序执行条件包含。当然,我可以模板我的整个类,避免在这个任务中使用预处理器,但目前我非常希望不使用。另外,除了类型之外,还可以定义另一个预处理器标志,但这似乎很脏。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-11-06 12:45:28

#if my_type == double不测试您是否做过#define my_type double。事实上,这将永远是真的。

在预处理算法中,只能使用整数常量表达式,因此必须设置如下内容:

代码语言:javascript
复制
// from your makefile or whatever
#define MY_TYPE MY_DOUBLE

..。

代码语言:javascript
复制
// 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
票数 8
EN

Stack Overflow用户

发布于 2014-11-06 12:45:41

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

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

票数 1
EN

Stack Overflow用户

发布于 2014-11-06 13:04:56

一个成熟的模板怎么样,比如:

代码语言:javascript
复制
template <class T>
void my_fct() {
 // your code based on T as a type
}

并且,您可以调用为:my_fct<int>、my_fct<double>等来传递数据类型,以便进行适当的模板实例化。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26779711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档