C++ C++;键入traits以提取模板参数类
在模板中,我希望将模板参数深入到真正的非模板类型。因此:C++ C++;键入traits以提取模板参数类,c++,templates,metaprogramming,typetraits,C++,Templates,Metaprogramming,Typetraits,在模板中,我希望将模板参数深入到真正的非模板类型。因此: template <typename T> struct MyTemplate { // sadly there's no extract_Base typedef typename extract_base<T>::MyType WorkType; }; struct X {}; template <typename T> struct Templ {}; //MyTemplate&l
template <typename T>
struct MyTemplate
{
// sadly there's no extract_Base
typedef typename extract_base<T>::MyType WorkType;
};
struct X {};
template <typename T> struct Templ {};
//MyTemplate<Templ<X>>::WorkType is X;
//MyTemplate<X>::WorkType is X;
模板
结构MyTemplate
{
//遗憾的是,这里没有提取基
typedef typename extract_base::MyType WorkType;
};
结构X{};
模板结构模板{};
//MyTemplate::工作类型为X;
//MyTemplate::工作类型为X;
我看到的唯一解决方案是定义真正的基本类型,比如std::vector::value_type是X。但我很好奇是否有一种方法可以做到这一点,而不必在每个目标模板中定义辅助类型
我看到了类似的东西,但这是草稿?我不太明白
是的,我知道有多重继承,但即使对于简单的情况,这也很好
更新:Nawaz解决方案对我来说非常有效,并且很容易扩展到特定情况,例如:
template<template<typename, typename> class X, typename T1, typename T2>
struct extract_base <X<T1, T2>> //specialization
{
typedef T1 base;
};
模板
结构提取库//专门化
{
T1型碱基;
};
我甚至可以将is_base_of或其他过滤器应用于T1/T2等等。因此,它确实适用于X—至少在g++4.6.7中是这样。首先,让我们称它为
value\u type
,而不是base
,因为value\u type
似乎是描述要提取的类型的更合适的术语
您可以使用以下选项:
template<typename T>
struct extract_value_type //lets call it extract_value_type
{
typedef T value_type;
};
template<template<typename> class X, typename T>
struct extract_value_type<X<T>> //specialization
{
typedef T value_type;
};
在线演示:
现在,在C++11中,您可以使用变量模板使
提取值类型
与包含多个模板参数的类模板一起工作,例如std::vector
,std::set
,std::list
等
template<template<typename, typename ...> class X, typename T, typename ...Args>
struct extract_value_type<X<T, Args...>> //specialization
{
typedef T value_type;
};
模板
结构提取值类型//专门化
{
类型定义T值_类型;
};
演示:这与继承或基类无关。有
std::is_base_of
,但这可能不完全符合您的目的。使用“模板类X”编译,确实有效!谢谢。@queen3:现在看看变量解。是的,虽然X对我有用,但请看更新。然而,这正是我所需要的。@queen3:我重命名了结构名和嵌套类型。现在就看吧value\u type
比base
更合适。在我的例子中,它是模板X:public T,所以它实际上是基础。
template<template<typename, typename ...> class X, typename T, typename ...Args>
struct extract_value_type<X<T, Args...>> //specialization
{
typedef T value_type;
};