Вы имеете в виду что-то подобное?
template<typename Type1, typename Type2, typename Option>
void foo (Type2 arg)
{
... code ...
}
template<typename Type1, typename Type2>
void foo (Type2 arg)
{
foo<Type1, Type2, DefaultOption>(arg);
}
Редактировать: приведенный выше фрагмент работает, но имеет недостаток, заключающийся в том, что Type2 должен быть явно указан в вызовах.
Я должен признать, что не могу придумать хорошее решение для полного шаблона; самое близкое, что я мог получить, это использовать пустые аргументы метода:
struct DefaultOption { ... } DEFAULT;
struct OtherOption { ... } OTHER;
template<typename Type1, typename Type2, typename Option>
void foo (Type2 arg, Option)
{
... code ...
}
template<typename Type1, typename Type2>
void foo (Type2 arg)
{
foo<Type1, Type2>(arg, DEFAULT);
}
Позволяет звонить в форме
foo<std::string>(1, DEFAULT);
foo<std::string>(1.0, OTHER);
foo<std::string>("Hello");
Мне любопытно, каков реальный ответ на эту загадку.