В настоящее время у меня есть что-то вроде:
template<typename T>
typename std::enable_if<!std::is_pointer<T>::value,void>::type
f( T const &t ) {
// ...
}
то есть я не хочу f
следует учитывать, если T
тип указателя Это отлично работает как есть. Тем не менее, теперь я хочу две разные версии f
в зависимости от того, является ли его аргумент значением, возвращаемым по сравнению с возвращаемым по ссылке:
std::string const& ret_by_ref();
std::string ret_by_val();
f( ret_by_ref() ); // I want the existing function to be called here
f( ret_by_val() ); // I want a new template specialization of f() called here
Как я могу дополнить существующую декларацию f
и создать новый f
так они называются как показано выше?
Ответ до C ++ — 11 приветствуется.
Это легко сделать с помощью ссылок rvalue. Просто добавь
template<typename T>
typename std::enable_if<!std::is_pointer<T>::value,void>::type
f( T &&t ) {
// ...
}
Для компилятора до 11 вы всегда можете обратиться к lib признаков черты типа boost.
повышение :: is_pointer
Я предлагаю вам начать читать Вот для некоторых «Фон и учебник» черт типа.