Я новичок в шаблонах 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);
. Почему?