Почему я не могу передать std :: vector <MyType>этой функции с параметрами шаблона шаблона? - PullRequest
2 голосов
/ 19 июня 2020

Я новичок в шаблонах C ++ и хочу написать шаблонную функцию, которая, в зависимости от ее параметров, возвращает либо один объект, либо вектор объектов.

У меня есть класс конфигурации, содержащий ключ / пары значений. Скажем, у меня есть ключ «parent.child.1», он должен возвращать единственный объект с id = 1. Если у меня есть ключ «parent.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 функция для каждого типа, умноженная на два, но я думаю, что могу значительно сократить шаблонный код для каждого другого типа, если буду использовать шаблоны. это в моем коде, как это (я использую С ++ 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);. Почему?

1 Ответ

2 голосов
/ 19 июня 2020

2-й getParameter принимает два параметра шаблона, но getParameter<std::vector<MyObject>>(...) указывает только один аргумент шаблона, тогда он не будет выбран.

Я думаю, что просто создание 2-го getParameter с одним параметром шаблона должно быть в порядке. например,

template<template T>
void getParameter(const string& key, typename enable_if< is_vector<T>::value, T>::type& val) {...}

Если вы хотите получить тип элемента, вы можете использовать тип элемента value_type из std::vector, например typename T::value_type.

...