Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;键入traits以提取模板参数类_C++_Templates_Metaprogramming_Typetraits - Fatal编程技术网

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;
};