通过类型的变量键入trait

时间:2016-09-12 20:55:39

标签: c++

我想测试一个变量类型的属性。我做到了,但代码太冗长了。

考虑一个例子,我在其中定义一个与容器中值类型相同类型的变量:

#include <vector>

int main() {
  std::vector<int> v, &rv=v;

  // ‘rv’ is not a class, namespace, or enumeration
  //rv::value_type i1;

  // Ok
  decltype(v)::value_type i2;

  // decltype evaluates to ‘std::vector<int>&’, which is not a class or enumeration type
  //decltype(rv)::value_type i3;

  // Ok
  std::remove_reference<decltype(rv)>::type::value_type i4;
}

我可以使用decltype,但添加std::remove_reference太多了。有没有很好的方法来缩短代码,而无需定义辅助模板?

2 个答案:

答案 0 :(得分:1)

你可以用

中的一个来缩短它
std::decay_t<decltype(rv)>::value_type i4 = 42;

std::decay_t<decltype(*std::begin(rv))> i4 = 42;

答案 1 :(得分:0)

使用一些使用声明

using my_value_type = decltype(v)::value_type;
using your_value_type = std::remove_reference<decltype(rv)>::type::value_type;

您的代码将变为:

int main() {
    std::vector<int> v, &rv=v;

    using my_value_type = decltype(v)::value_type;
    using your_value_type = std::remove_reference<decltype(rv)>::type::value_type;

    my_value_type i2;
    your_value_type i4;
}