C++ 如何获取最内部的模板参数类型? Q
在类的虚拟示例中C++ 如何获取最内部的模板参数类型? Q,c++,templates,c++11,template-meta-programming,C++,Templates,C++11,Template Meta Programming,在类的虚拟示例中 typedef myStruct<myStruct<myStruct<int>>> mv; 愿望者 是否可以使用模板别名完成此操作(此处缺少模板参数) 在一个示例中,我的类型是 vector<vector<vector<int>>> 向量 如果vector需要一个额外的模板参数,是否有方法执行相同的操作?当然,可以划分不同的实现,但是有没有一种方法可以扩展第一个问题的解决方案来处理这些情况呢 尝试以下
typedef myStruct<myStruct<myStruct<int>>> mv;
愿望者
vector<vector<vector<int>>>
向量
如果vector
需要一个额外的模板参数,是否有方法执行相同的操作?当然,可以划分不同的实现,但是有没有一种方法可以扩展第一个问题的解决方案来处理这些情况呢尝试以下方法。如果模板有多个元素,它还会返回一个元组:
#包括
#包括
模板
最里面的结构
{
使用类型=T;
};
模板
最里面的结构
{
使用type=typename最里面的\u impl::type;
};
模板
最里面的结构
{
使用type=std::tuple;
};
模板
使用innerst=typename innerst_impl::type;
模板
结构X;
静态断言(std::is_same::value,“”);
int main()
{
}
>Ongon,如果有几个模板,我们将只考虑第一个模板参数。没错。它也稍微简单一些
#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()
{
}
#包括
#包括
#包括
模板
最里面的结构
{
使用类型=T;
};
模板
最里面的结构
{
使用type=typename最里面的\u impl::type;
};
模板
使用innerst=typename innerst_impl::type;
模板
结构X;
静态断言(std::is_same::value,“”);
静态断言(
std::值是否相同,
""
);
int main()
{
}
请注意,没有尝试验证是否反复使用相同的模板。用例到底是什么?(我怀疑是XY问题)。C++不支持反射,所以没有通用/标准的解决方案。this@quantev纯粹是一个元编程测试,以准确地解决它所说的问题。这是一种现场专家练习(尽管我已经知道3个人可以很容易地回答这个问题-你可以在我的个人资料中看到这样的问题,以查看常见的疑点)什么是vector
,内部类型应该是std::pair
?或者不允许使用混合模板?“事实上,它感觉不太明确。”MatthieuM说。是的,尽管我必须承认我没有考虑改变内部模板vector
看起来并不是一个荒谬的问题,但它既不要求验证也不要求对不同的内部模板进行扩展(因为你想到了额外的问题,看到一种方法会很有趣)@Nikos,感谢你发布了这个“元编程测试”,它只是帮助我解决了一个真实世界的问题。我正在为V8开发一个类包装器,比如late,这解决了我想使用Opt来标记方法调用的可选参数的问题。还感谢0x499602D2和Matthieu M提供的答案。酷。如果它也适用于非模板类型,那就太好了。。。(因此它通常可以在模板内部使用),在这种情况下,非模板类型返回(是否?)@quantdev您可能需要对采用非类型的模板进行一系列专门化。不幸的是,到目前为止还没有能够表示非类型的模板构造。这实际上不适用于X
beingstd::vector
(),您必须修改E
的处理,以仅使用其中的第一个元素;但是map
上的行为可能会令人惊讶。@MatthieuM。我知道。有解决方案吗?除非指定了std::map
的所需行为。如果我们总是使用第一个参数,这很容易,但是如果我们真正想要的是本例中的内部元素,那么我看不到通用的方法:xx让我想起了Alexandrescu的类型列表和模板级联+1好技术
#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()
{
}