为什么我不能将 std::vector<MyType> 传递给带有模板模板参数的函数?
Why can't I pass std::vector<MyType> to this function with template template parameters?
我是 C++ 模板的新手,我想编写一个模板函数,根据其参数,return可以是单个对象或对象向量。
我有一个包含 key/value 对的配置 class。假设我有密钥 "parent.child.1",它应该是 return id=1 的单个对象。如果我有密钥 "parent.child" 那么它应该 return 子项下的所有对象。子项下的所有对象都是相同类型,但不同的子项可能持有不同的对象。
在我看来,生成的代码如下所示:
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 函数专门化两次来做到这一点,但我认为如果我使用模板,我可以为每种不同的类型减少很多样板代码。
我已经关注了 SO 问题并在我的代码中使用了它(我使用的是 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
。
我是 C++ 模板的新手,我想编写一个模板函数,根据其参数,return可以是单个对象或对象向量。
我有一个包含 key/value 对的配置 class。假设我有密钥 "parent.child.1",它应该是 return id=1 的单个对象。如果我有密钥 "parent.child" 那么它应该 return 子项下的所有对象。子项下的所有对象都是相同类型,但不同的子项可能持有不同的对象。
在我看来,生成的代码如下所示:
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 函数专门化两次来做到这一点,但我认为如果我使用模板,我可以为每种不同的类型减少很多样板代码。
我已经关注了
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
。