Я не могу ответить на ваш вопрос («почему бы и нет?»), Но могу предоставить обходной путь. Но человек, это безобразно. В итоге вы определяете структуру и функцию для каждой функции:
template<class StringType, class T = typename ValidatedStringType<StringType>::type>
struct f_helper {
void operator()( T const& s ) {
// Put the contents of f() here
}
};
template<class StringType>
void f(StringType const &s) {
f_helper<StringType>()( s );
}
Я уверен, что есть какая-то магия предварительной обработки, которую вы могли бы написать, чтобы устранить некоторые из шаблонов, но это также было бы довольно уродливо:
#define DECL_VALIDATED_FUNC( RetType, name, Validator, contents ) \
template<class StringType, class T = typename Validator<StringType>::type> \
struct name ## _helper { \
RetType operator()( T const& s ) contents \
}; \
\
template<class StringType> \
RetType name(StringType const& s) { \
name ## _helper<StringType>()( s ); \
}
DECL_VALIDATED_FUNC( void, f, ValidatedStringType, {
// put contents of f() here
}) // note the closing parenthesis
К сожалению, вы не можете указать аргументы шаблона по умолчанию для свободных функций, иначе вы могли бы сделать:
template<class StringType, class T = typename ValidatedStringType<StringType>::type>
void f( T const& s ) {}