Выберите функцию в зависимости от того, является ли шаблон указателем / ссылкой или нет - PullRequest
0 голосов
/ 28 ноября 2018

Я хотел бы предоставить различные реализации функции в зависимости от того, является ли она указателем, ссылкой или обычным типом.Это мой код:

template<class T,
         class = typename std::enable_if_t<std::is_reference<T>::value>>
void f(T && in)
{}

// This causes redefinition error 
template<class T,
    class = typename std::enable_if_t<std::is_pointer<T>::value>>
void f(T && in)
{}

template<class T,
    class = typename std::enable_if_t<!std::is_reference<T>::value>,
    class = typename std::enable_if_t<!std::is_pointer<T>::value>>
void f(T && in)
{}

Средняя функция вызывает:

12: 13: ошибка: переопределение 'template void f (T &&)'

7: 13: примечание: здесь ранее объявлено 'template void f (T &&)'

К счастью, только первая и последняя функции вместе скомпилированы.

Любые идеи, как это исправитьили упростите этот код.

Ответы [ 2 ]

0 голосов
/ 28 ноября 2018

Обычным способом является предоставление соответствующих перегрузок:

#include <iostream>

template <class T> void f(T&&) {
    std::cout << "T&&\n";
}

template <class T> void f(T*) {
    std::cout << "T*\n";
}

template <class T> void f(T&) {
    std::cout << "T&\n";
}

int main() {
    int i;
    f(std::move(i));
    f(&i);
    f(i);
}

Это приводит к следующему выводу:

[temp]$ clang++ -std=c++11 test.cpp
[temp]$ ./a.out
T&&
T*
T&
[temp]$ 
0 голосов
/ 28 ноября 2018

Значения аргументов шаблона по умолчанию не являются частью сигнатуры, поэтому вам необходимо устранить неоднозначность перегрузок, например, добавив дополнительный фиктивный параметр шаблона:

template<class T,
         class = typename std::enable_if_t<std::is_reference<T>::value>>
void f(T && in)
{}

// This causes redefinition error 
template<class T,
    class = typename std::enable_if_t<std::is_pointer<T>::value>, class = void>
void f(T && in)
{}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...