Как преобразовать шаблон в шаблон pre C ++ 11 - PullRequest
1 голос
/ 20 февраля 2020

По запросу этот вопрос Я написал шаблон, который позволяет преобразовать шаблон в шаблон с различными параметрами:

template< template <int A,char B,bool> typename T>
struct Add_true {
    template <int A,char B> using type = T<A,B,true>;
};

Справочная информация: цель состояла в том, чтобы передать template<int A, char B, bool C> class A2{}; в качестве параметра шаблона шаблона для template<template<int A, char B> typename T> class A1 {};. Я узнал о шаблонах с C ++ 11. Когда я привык писать типы / функции, которые берут типы и возвращаемые типы, вместо написания функций, которые принимают значения и возвращают значения, это был совершенно сдвиг в мышлении о коде. Мне никогда не приходило в голову, что также удивительно просто писать шаблоны, которые дают шаблону «возвращать» другой шаблон. Дело в том, что я не имею ни малейшего понятия, как написать выше или аналогичные шаблоны без псевдонимов, которые доступны только с C ++ 11. То, что было возможно всегда afaik, следующее. Учитывая

template <int A,char B, bool C> struct Foo{};

, я могу "привязать" параметр bool к Foo через:

template <int A,char B>
struct Add_true_to_Foo {
     typedef Foo<A,B> type;
};

Но теперь Add_true_to_Foo<A,B>::type не является шаблоном, и я не имею ни малейшего понятия, без чего C ++ 11 как написать Add_true, который будет работать не только для Foo, но и для

template <int A,char B, bool C> struct Bar{};

Может быть, я упускаю что-то очевидное. Мой вопрос:

Можно ли написать эквивалент выше Add_true до C ++ 11?

Ответы [ 3 ]

2 голосов
/ 20 февраля 2020

Нет строгих эквивалентов использования шаблона C ++ 11, но вы можете добавить дополнительный класс шаблона вместо поведения mimi c и с другим синтаксисом:

template <template <int, char, bool> class C>
struct Add_true {
    template <int A, char B>
    struct apply
    {
        typedef T<A, B, true> type;
    }
};

При использовании:

template <int A,char B, bool C> struct Foo{};

typedef Add_true<Foo>::apply<42, '*'>::type my_type; // Foo<42, '*', true>
1 голос
/ 20 февраля 2020

В C ++ 03 у нас не было псевдонимов шаблонов, но того же можно добиться с помощью шаблонов структур, таких как:

template<template<int A, char B> class T> class A1
{
    typedef typename T<1, 'a'>::type actual_A2;
};

template<int A, char B, bool C> class A2 {};

template< template<int A, char B, bool C> class T >
struct Add_true
{
    template<int A, char B>
    struct apply
    {
        typedef T<A, B, true> type;
    };
};
typedef Add_true<A2> A2_with_true;

A1< A2_with_true::apply > a1;

Обратите внимание, что вам нужно изменить, как A1 работает как оно необходимо использовать вложенный type typedef для получения фактической A2 специализации.

1 голос
/ 20 февраля 2020

Наследование будет в C ++ 03

template< template <int A,char B,bool> typename T>
struct Add_true {
    template <int A,char B>
    struct type : T<A,B,true> {};
};

И в C ++ 11, и в C ++ 03 type - это имя нового шаблона. Разница только в том, что означают специализации. Для шаблонов псевдонимов они точно соответствуют псевдонимам, в то время как здесь они являются новыми типами. Однако преобразование в базовые преобразования должно позволять трактовать специализацию C ++ 03 type почти так же, как если бы они были «псевдонимом».

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