C ++模板模板实例化

时间:2015-01-30 19:55:28

标签: c++ templates template-meta-programming

我有以下用于可变参数包的封装代码。

template <typename... Args>
struct pack
{
};

template <template <typename... Args> class ENCAP, typename... Args>
struct encapsulate_arguments
{
    typedef pack<ENCAP<Args>...> type;
};

template <template <typename... Args> class ENCAP, typename... Args>
struct encapsulate_arguments<ENCAP, pack<Args...>>
{
    typedef pack<ENCAP<Args>...> type;
};

template <typename L>   
struct Master
{
    template <typename T>
    struct Slave
    {
        typedef T type; 
    };
};

这适用于封装可变参数包,例如:

typedef encapsulate_arguments<Master<float>::Slave, double, int>::type foo;

typedef encapsulate_arguments<Master<float>::Slave, pack<double, int>>::type foo;

typedef encapsulate_arguments<std::vector, pack<double, int>>::type foo;

,它不依赖于另一个模板参数 - 导致定义如下:

pack<Master<float>::Slave<double>, Master<float>::Slave<int>>

pack<std::vector<double>, std::vector<int>>

问题是,如果我想使封装模板参数ENCAP类型依赖,我就无法编译它:

template <typename L>   
struct Other
{
// ARGGH!!!
//  typedef encapsulate_arguments<Master<L>::Slave, pack<double, int>>::type EmbeddedType;
};

http://ideone.com/ZwfVaU

这是否可行和/或我如何才能使这项工作?

1 个答案:

答案 0 :(得分:3)

您错过了typenametemplate

typedef typename encapsulate_arguments<
//      ^^^^^^^^
    Master<L>::template Slave, pack<double, int>
//             ^^^^^^^^
>::type EmbeddedType;

<强> Demo