получить первый шаблонный параметр класса - PullRequest
1 голос
/ 01 ноября 2019

У меня есть класс foo, который принимает два параметра шаблона, и я хочу установить по умолчанию второй параметр в качестве первого параметра шаблона первого параметра, если он существует. foo будет выглядеть как

template<typename Class, typename T = typename first_template_parameter<Class>::type>
class foo
{
   ...
}

, и если Class определено как template<typename A, typename B, ...> class bar, я хочу, чтобы T было A. Так, например, foo<std::map<int, float>> будет иметь Class = std::map<int, float>, а T = int, foo<int, char> будет иметь Class = int и T = char. Как я могу реализовать first_template_parameter?

1 Ответ

1 голос
/ 01 ноября 2019

Детализация до первого параметра шаблона требует небольшой работы, связанной со специализацией:

template<typename T> struct first_template_type;

template<template<typename T, typename ...> class t,
     typename T, typename ...Args>
struct first_template_type<t<T, Args...>> {
    typedef T type_t;
};

template<typename T>
using first_template_type_t=typename first_template_type<T>::type_t;

Как только все вышло, все остальное довольно скучно:

#include <map>

template<typename Class,
     typename T = first_template_type_t<Class>>
class foo
{
public:
    T bar;
};

foo<std::map<int, char>> Foo;

int *baz=&Foo.bar;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...