[英]Why can't I pass std::vector<MyType> to this function with template template parameters?
我是 C++ 模板的新手,我想编写一个模板 function,它根据其参数返回单个 object 或对象向量。
我有一个包含键/值对的配置 class 。 假设我有密钥“parent.child.1”,它应该返回一个 id=1 的 object。 如果我有键“parent.child”,那么它应该返回子项下的所有对象。 child 下的所有对象都是相同的类型,但不同的 child 可能持有不同的对象。
在我看来,生成的代码如下所示:
getParameter<MyObject>(key, value); //value is a referance, if key found copy it into value
getParameter<std::vector<MyObject>>(key, vectorValue); //value is a referance to the vector
我可以通过为每种类型专门设置 getParameter function 来做到这一点,乘以 2,但我认为如果我使用模板,我可以为每种不同类型减少大量样板代码。
我已经关注了另一个SO question,并在我的代码中使用了它(我使用的是 c++11,所以它有点不同):
template<typename T>
void getParameter(const string& key, typename enable_if< !is_vector<T>::value,T>::type& val) {...} //Works fine when calling getParameter<MyObject>(key, value);
template<template<typename...>> class C, typename U>
void getParameter(const string& key, typename enable_if< is_vector<C<U>>::value, C<U>>::type& val) {...}//Fails in compile
当我调用getParameter<std::vector<MyObject>>(key, vectorValue);
时,它无法替换这两个函数 . 这是为什么?
第二个getParameter
接受两个模板参数,但getParameter<std::vector<MyObject>>(...)
只指定一个模板参数,然后它不会被选中。
我认为让第二个getParameter
采用一个模板参数应该没问题。 例如
template<template T>
void getParameter(const string& key, typename enable_if< is_vector<T>::value, T>::type& val) {...}
如果要获取元素类型,可以使用std::vector
的成员类型value_type
,例如typename T::value_type
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.