如何获取向量中元素的类型?

use*_*710 6 c++ stl vector c++11

考虑模板元编程技术,如果我有

std::vector<int> v;
v.push_back(42.42f);
Run Code Online (Sandbox Code Playgroud)

这是有效的,主要是因为使用它的构造函数没有标记explicit,换句话说,我的push_back它不是类型安全的.

现在我处在一种我甚至不知道如何v声明容器的情况,在这种情况下它是int,但我需要在具有泛型时自动推断出类型std::vector<T>.我想得到一个解决方案T.

在C++ 11中有类似的东西remove_all_extents(有一个有用的成员type),但显然它只对旧数组有用,但它基本上是我想要实现的.

我想在push_back它不是类型安全的时候触发错误或者推断出类型,这样我就可以编写一个断言或者自己实现一些东西.

我真的找不到一个有效的解决方案,它在理论上如此简单,但是一旦声明了一个向量,就没有关于用于元素的类型的明确信息.

我也想避免显式类型推断,比如foo从我理想的函数调用中进行翻译

foo( container, elements ... )
Run Code Online (Sandbox Code Playgroud)

foo<int>(container, elements ...)
Run Code Online (Sandbox Code Playgroud)

在哪里int是元素的类型,container在我看来这也不安全,它也更冗长,更容易出错.

那么如何在C++ 11中检索容器元素的类型呢?

jua*_*nza 9

你可以得到这样的类型:

typename std::vector<T>::value_type;
Run Code Online (Sandbox Code Playgroud)

然后static_assert一起使用std::is_same.

template <typename T1, typename T2>
void special_push_back(std::vector<T1>& v, T2 elem)
{
  // check that T1 and T2 are the same before pushing elem into v
}
Run Code Online (Sandbox Code Playgroud)

然后

std::vector<int> v;
special_push_back(v, 3.14); // Compile time error: double is not int
Run Code Online (Sandbox Code Playgroud)

  • @ user2485710:如果我理解正确,则decltype(container):: value_type应该有效 (2认同)

Aja*_*jay 8

如果你有 C++11 特性,你还可以使用decltype关键字来简化对底层value_type类型成员的访问:

decltype(TheContainer)::value_type nVarOfType;
Run Code Online (Sandbox Code Playgroud)

在这里,TheContainer可能是任何类型的容器。例如,一个map<int, string>deque<float>或任何其他STL容器-所有STL容器具有value_type类型定义。decltype键将给出给定对象的类型。