通过类型的变量进行类型trait

Type trait through a variable of the type

本文关键字:类型 trait 变量      更新时间:2023-10-16

我想测试一个变量类型的属性。我确实可以,但是代码太啰嗦了。

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

#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太多了。有没有什么好的方法可以在不定义辅助模板的情况下缩短代码?

你可以用

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

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

使用一些声明:

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;
}