如果有的话,考虑模板元编程技术
std::vector<int> v;
v.push_back(42.42f);
这行得通,主要是因为所使用的构造函数未标记explicit
,换句话说,我push_back
的类型不安全。
现在,我什至不知道如何v
声明容器(在这种情况下是这样)int
,但是我需要在拥有泛型的同时自动推断类型std::vector<T>
。我想要一个解决方案T
。
在C ++ 11中,有一个类似的东西remove_all_extents
(带有一个有用的成员type
),但显然它仅对旧数组有用,但这基本上是我想要实现的目标。
当push_back
它不是类型安全或推断类型时,我想触发一个错误,以便我可以自己编写断言或实现某些东西。
我真的找不到适合的解决方案,它在理论上是如此简单,但是一旦声明了向量,就没有关于元素类型的明确信息。
我还想避免显式类型推断,例如foo
从理想的函数调用中进行翻译
foo( container, elements ... )
至
foo<int>(container, elements ...)
我认为这的int
元素的类型在哪里container
也不安全,它也比较冗长且容易出错。
那么如何在C ++ 11中检索容器元素的类型?
您可以得到如下类型:
typename std::vector<T>::value_type;
然后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
}
然后
std::vector<int> v;
special_push_back(v, 3.14); // Compile time error: double is not int
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句