我开始重写大量必须适用于多个OS /编译器组合的代码。有些支持C ++ 11,有些只支持C ++ 98 / C ++ 03。我正在寻找一种方法,可以在代码中使用一些 C ++ 11功能。
我感兴趣的主要是override
,noexcept
和final
。换句话说,语法上很小的功能并没有真正具有C ++ 98/03等效功能。我不是想在What's the C++98 equivalent of the auto iterator reference?中使用ifdef
来尝试使用#if __cplusplus > 201103L
#define OVERRIDE override
#else
#define OVERRIDE
#endif
。那太笨拙了。
我最初的想法是使用预处理器来做这样的事情:
virtual void myFunction() OVERRIDE;
然后我的函数声明如下:
MY_OVERRIDE
我不知道像Boost这样的产品是否已经有了这样的机制,但在我的情况下这是无关紧要的,因为我无法访问某些操作系统上的Boost或类似内容。 OS /编译器也不是升级选项。我要么自己做,要么根本不去做。
有更好的方法吗?我是否使用这种方法让自己陷入一些未知的头痛?另外,我应该尝试为宏使用不同的名称,例如var newData = json.reduce(function (arr, currentValue){
var index = false;
arr.forEach(function(item, i) {
if (item.name === currentValue.name && (item.truthy && currentValue.truthy || item.truthy === undefined && currentValue.truthy === false)) {
index = i;
}
});
if (index === false) {
var newItem = {
name: currentValue.name,
values: [currentValue.value]
};
if (currentValue.truthy) {
newItem.truthy = true;
}
arr.push(newItem);
return arr;
}
arr[index].values.push(currentValue.value);
return arr;
}, []);
,以避免命名冲突吗?
答案 0 :(得分:3)
没关系,这是一种可接受的做事方式。我在许多代码库中看到了这一点,就像我们以前看到的那样:
#ifdef __STDC__
void func(int x)
#else
void func(x)
int x;
#endif
{
...
}
我无法想象Boost会比你写的更有用或更简洁。
但是,您可能希望使用更少的R拼写覆盖。如果您正在编写其他项目将使用的库,则首选MY_OVERRIDE
,否则OVERRIDE
就可以了。
P.S。您可能会对这些功能的常见支持感到惊讶。例如,Visual Studio 2008支持override
就好了,即使__cplusplus < 201103L
。
答案 1 :(得分:2)
#if __cplusplus > 201103L
#else
#define override
#endif
然后你的函数声明如下:
virtual void myFunction() override;
这正是你想要的,不是吗?