О псевдониме шаблона - PullRequest
       3

О псевдониме шаблона

0 голосов
/ 02 января 2019

template <bool AddOrRemoveRef>
struct Fun_;

template <>
struct Fun_<true> {
    template <typename T> using type = std::add_lvalue_reference<T>;
};

template <>
struct Fun_<false> {
   template <typename T> using type = std::remove_reference<T>;
};

template <typename T>
template<bool AddOrRemove>
using Fun = typename Fun_<AddOrRemove>:: template type<T>;

// question 1. I changed the two template <> postion,and got a compile error.So i really can not distinguish the sequence of two template <T> in this situation. Is there some introduction?
// template <bool AddOrRemove>
// template <typename T>
// using Fun = typename Fun_<AddOrRemove>:: template type<T>;

template <typename T> using RomoveRef = Fun<false>;

int main()
{
    RomoveRef<int&>::type j = 1; // ok
    printf("%d\n", j);

    // question 2. I want to use Fun directly, how can i do?
    // template Fun<false>::type<int&> i = 1;
    // printf("%d\n", i);

    return 0;
}

У меня есть два вопроса, которые написаны в комментариях в приведенном выше коде. Пожалуйста, дайте мне несколько советов, если это возможно, спасибо.

1.Как понять два шаблона <> . 2.Как использовать Fun :: type или Fun _ :: type реализовать ту же функцию, что и RomoveRef

1 Ответ

0 голосов
/ 02 января 2019

По первому вопросу g++ говорит, что «слишком много списков параметров», где clang++ говорит «список посторонних параметров шаблона в объявлении шаблона псевдонима». Чтобы компилировать код, вы должны написать это:

template <bool AddOrRemove, typename T>
using Fun = typename Fun_<AddOrRemove>::template type<T>;

По поводу второй функции, если я правильно понял, может быть, вы хотите что-то вроде

template <typename T>
using RomoveRef = Fun<!std::is_reference<T>::value, T>;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...