Преобразовать std :: variable в std :: tuple экземпляров класса шаблона - PullRequest
4 голосов
/ 25 июня 2019
Функция

transform_v2t в приведенном ниже коде создает набор экземпляров шаблона класса A:

template <typename T>
struct A
{
    T val;
};

template <class V, template <class> class T, std::size_t... index>
inline constexpr auto transform_v2t(std::index_sequence<index...>)
{
    return std::make_tuple(T<std::variant_alternative_t<index, V>>() ...);
}

template <class V, template <class> class T>
inline constexpr auto transform_v2t()
{
    return transform_v2t<V, T>(std::make_index_sequence<std::variant_size_v<V>>());
}

typedef std::variant<bool, char, int, float, double, std::string> V;

int main()
{
    auto t1 = transform_v2t<V, A>();
}

возможно ли применить одну и ту же функцию transform_v2t к классу с двумя аргументами шаблона, например:

template <typename P, typename T>
struct B
{
    P other_val;
    T val;
};

со специализацией P как int?

с псевдокодом это может быть что-то вроде этого:

template <class T> typedef B<int, T> PartiallySpecializedB;
auto t2 = transform_v2t<V, PartiallySpecializedB>();

см. образец кода онлайн .

1 Ответ

6 голосов
/ 25 июня 2019

Никогда не используйте typedef в коде после C ++ 11, всегда предпочитайте using (известный как объявления псевдонимов).

Мало того, что их легче читать, потому что имя, которое вы объявляете, находится слева (в отличие от ... везде):

using V = std::variant<bool, char, int, float, double, std::string>;

... но они также имеютподдержка объявлений шаблонов псевдонимов:

template <class T> 
using PartiallySpecializedB = B<int, T>;

auto t2 = transform_v2t<V, PartiallySpecializedB>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...