Выбор шаблонной функции C ++ в зависимости от того, является ли аргумент значением или ссылкой

В настоящее время у меня есть что-то вроде:

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 приветствуется.

0

Решение

Это легко сделать с помощью ссылок rvalue. Просто добавь

template<typename T>
typename std::enable_if<!std::is_pointer<T>::value,void>::type
f( T &&t ) {
// ...
}
0

Другие решения

Для компилятора до 11 вы всегда можете обратиться к lib признаков черты типа boost.

повышение :: is_pointer

http://www.boost.org/doc/libs/1_43_0/libs/type_traits/doc/html/boost_typetraits/reference/is_pointer.html

Я предлагаю вам начать читать Вот для некоторых «Фон и учебник» черт типа.

-1

По вопросам рекламы [email protected]