Одним простым способом является использование out-param, так что параметр шаблона может быть выведен из аргумента:
#include <vector>
using std::vector;
template <typename T>
void GetValue(T &t)
{
t = T(); // some value
}
template <typename T>
void GetValue(vector<T> &v)
{
v = vector<T>(); // some vector of values
}
int main(int argc, char* argv[])
{
int i;
GetValue(i);
vector<int> v;
GetValue(v);
return 0;
}
GetValue(v)
не является неоднозначным, поскольку правила вывода аргумента шаблона говорятчто вторая перегрузка лучше подходит.
Это не обязательно тот интерфейс / стиль, который вы хотите, однако, в этом случае вы можете использовать частичную специализацию вместо перегрузки.Но для этого нужен класс, поскольку шаблоны функций не могут быть частично специализированными:
#include <vector>
using std::vector;
template <typename T>
struct Getter {
T get(void) {
return T(); // some value
}
};
template <typename T>
struct Getter<vector<T> > {
vector<T> get(void) {
return vector<T>(); // some vector of values
}
};
template <typename T>
T GetValue(void)
{
return Getter<T>().get();
}
int main(int argc, char* argv[])
{
int i = GetValue<int>();
vector<int> v = GetValue<vector<int> >();
return 0;
}