Distin guish между передачей по значению и передачей по ссылке в шаблоне функции - PullRequest
4 голосов
/ 29 февраля 2020

Есть ли способ дать компилятору различить guish, является ли переданная переменная ссылкой или нет, без явного указания ее, например, <int &>? В следующем примере отображается «1», тогда как я ожидал «2»:

template <typename Type>
void fun(Type)
{
    cout << 1 << '\n';
}

template <typename Type>
void fun(Type &)
{
    cout << 2 << '\n';
}

int main()
{
    int x = 0;
    int &ref = x;
    fun(ref);
}

Я также пытался использовать std::ref, но у меня это не работает.

1 Ответ

2 голосов
/ 29 февраля 2020
template <typename Type, typename = std::enable_if_t<!std::is_reference<Type>::value>>
void fun(Type)
{
    std::cout << 1 << '\n';
}

template <typename Type, typename = std::enable_if_t<std::is_reference<Type>::value>>
void fun(Type &)
{
    std::cout << 2 << '\n';
}

int main() {

    int x = 0;
    int &ref = x;
    fun<int&>(ref); // Call the one that you want, and don't leave the compiler decide which one you meant

    return EXIT_SUCCESS;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...