Как применить параметры шаблона шаблона в случае вариационного шаблона - PullRequest
0 голосов
/ 26 января 2019

Я работаю над шаблоном MyTemplate, который будет использоваться следующим образом:

using Alias = MyTemplate<std::pair<int, char>,
                         std::pair<int, double>,
                         std::pair<int, unsigned int>>;

На данный момент мы можем предположить, что MyTemplate будет принимать только список типов пар.Более того, все типы пар должны иметь один и тот же первый тип, а второй тип должен различаться.

Я хочу "поймать" пары "first_type в MyTemplate.Я придумал следующее определение:

template<typename... Ts>
struct MyTemplate
{
   using first_type = std::decay_t<decltype((Ts::first_type, ...))>;
   // ...
};

Когда я использую typename MyTemplate::first_type в контексте другого шаблона, все работает нормально.Я получаю только предупреждение:

warning: left operand of comma operator has no effect [-Wunused-value]
    using first_type = std::decay_t<decltype((Ts::first_type, ...))>;
                                                                    ^

Однако я не могу создать экземпляр Alias, потому что я получаю эту ошибку:

error: missing 'typename' prior to dependent type name 'std::pair<int, char>::first_type'

Вы дали какую-либо идею для "общего" решения?Я могу использовать C + 17.

1 Ответ

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

На данный момент мы можем предположить, что MyTemplate будет принимать только список типов пар. Кроме того, все типы пар должны иметь один и тот же первый тип, а второй тип должен различаться.

Я хочу «поймать» пары 'first_type в MyTemplate.

Не уверен, но мне кажется, что вы выглядите следующим образом

template <typename...>
struct MyTemplate;

template <typename FT, typename ... STs>
struct MyTemplate<std::pair<FT, STs>...>
 {
   using first_type = FT;
 };

Вы можете подтвердить

using Alias = MyTemplate<std::pair<int, char>,
                         std::pair<int, double>,
                         std::pair<int, unsigned int>>;

static_assert( std::is_same<int, typename Alias::first_type>::value, "!" );

Таким образом, вы также навязываете, что все параметры шаблона MyTemplate std::pairs с общим first_type.

В противном случае, без специализации шаблона и ведения вашего пути, вы можете использовать std::tuple / std::tuple_element_t

template <typename ... Ts>
struct MyTemplate
 {
   using first_type = std::tuple_element_t<0, std::tuple<typename Ts::first_type...>>;
 };
...