为什么我不能将 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