通过"使用"缩短std :: remove_const(decltype(something))表达

时间:2015-11-28 18:39:37

标签: c++ decltype

如果我使用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;表达,但我不知道如何或如果整体可能。

1 个答案:

答案 0 :(得分:1)

我不认为这是可能的。特别是你需要的形式。可以在函数上下文中使用类型推导,如下所示:

template<typename Type>
auto no_const(Type&&) { return typename std::decay<Type>::type(); }

但是会产生这样的语法:

auto x = no_const(a);

Live demo

Diclamer :在实现中使用std::decay可能会产生数组和其他“特殊”类型的奇怪结果;我没有测试过;这只是一个原型。

我不得不说我非常不赞成使用它,因为它真的是非惯用的C ++。只需键入这些额外的字符,并在对象声明中使用decltype