如果我使用C方式,我可以执行以下操作:
#define NOCONST(x) std::remove_const<decltype(x)>::type
const int a;
NOCONST(a) b;
如果我使用C ++方式
template <typename T>
using noConst = std::remove_const<T>::type;
const int a;
noConst<decltype(a)> b;
尽管如此,&#34;使用&#34;更正确,宏更短。有没有办法进一步缩短&#34;使用&#34;表达?模板参数中没有额外的decltype?
澄清 - 我需要使用像
这样的东西noConst(a) b;
或
noConst<a> b;
没有decltypes和params中的其他东西。 decltype应该以某种方式转移到&#34;使用&#34;表达,但我不知道如何或如果整体可能。
答案 0 :(得分:1)
我不认为这是可能的。特别是你需要的形式。可以在函数上下文中使用类型推导,如下所示:
template<typename Type>
auto no_const(Type&&) { return typename std::decay<Type>::type(); }
但是会产生这样的语法:
auto x = no_const(a);
Diclamer :在实现中使用std::decay
可能会产生数组和其他“特殊”类型的奇怪结果;我没有测试过;这只是一个原型。
我不得不说我非常不赞成使用它,因为它真的是非惯用的C ++。只需键入这些额外的字符,并在对象声明中使用decltype
。