通过类型变量进行类型特征推导

4

我希望测试变量类型的属性。虽然我可以做到,但代码太冗长。

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

#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
你想要测试哪个属性?(这看起来很像一个X-Y问题。) - molbdnilo
不知道,remove_reference 这一行看起来对我来说并不那么糟糕,尤其是考虑到你不会做这种事情数十次。话虽如此,答案可能是“不”。 - Baum mit Augen
如果您正在重复使用它,可以使用 using 语句并将其别名为 value_type 或其他名称。 - jaggedSpire
是的,这是一个X-Y问题。实际问题(“X”)是要检查两个映射是否具有相同的键比较器,而decltype(m.key_comp())是一个解决方案。但是,我很好奇是否可以解决“Y”。 - olpa
2个回答

3
您可以使用以下方法之一来缩短它:
std::decay_t<decltype(rv)>::value_type i4 = 42;

或者

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

0

使用一些 using 声明

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接