How can I get the innermost template parameter type?

橙三吉。 提交于 2019-12-23 10:37:10

问题


Q

In a dummy example of a class

typedef myStruct<myStruct<myStruct<int>>> mv;

int is the innermost template parameter. How can I get the type of that parameter for arbitrary nesting depth?

Desired Result

A mechanism to acquire the innermost type

innermost<mv>::type -> int

WishList

  1. Can this be done using template aliases (template template parameters are a missing feature here)?

  2. In an example where my type would be

    vector<vector<vector<int>>>
    

    Is there a way to perform the same operation, given that vector expects an extra template parameter ? Ofcourse a distinct implementation could be divised but is there a way to scale the solution for the first problem to handle these cases as well ?


回答1:


Try the following. It also returns a tuple if the template has more than one element:

#include <tuple>
#include <type_traits>

template<typename T>
struct innermost_impl
{
    using type = T;
};

template<template<typename> class E, typename T>
struct innermost_impl<E<T>>
{
    using type = typename innermost_impl<T>::type;
};

template<template<typename...> class E, typename... Ts>
struct innermost_impl<E<Ts...>>
{
    using type = std::tuple<typename innermost_impl<Ts>::type...>;
};

template<typename T>
using innermost = typename innermost_impl<T>::type;

template<class>
struct X;

static_assert(std::is_same<innermost<X<X<X<int>>>>, int>::value, "");

int main()
{
}



回答2:


Building on 0x499602D2's answer, we get the following to only consider the first template parameter if ever there are several. And yes it compiles. It's also slightly simpler.

#include <tuple>
#include <type_traits>
#include <vector>

template<typename T>
struct innermost_impl
{
    using type = T;
};

template<template<typename...> class E, typename Head, typename... Tail>
struct innermost_impl<E<Head, Tail...>>
{
    using type = typename innermost_impl<Head>::type;
};

template<typename T>
using innermost = typename innermost_impl<T>::type;

template<class>
struct X;

static_assert(std::is_same<innermost<X<X<X<int>>>>, int>::value, "");

static_assert(
    std::is_same<innermost<std::vector<X<std::vector<int>>>>, int>::value,
    ""
);

int main()
{
}

Note that no attempt is made to validate that the same template is used over and over.



来源:https://stackoverflow.com/questions/25187323/how-can-i-get-the-innermost-template-parameter-type

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!