我有以下用于可变参数包的封装代码。
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;
};
这是否可行和/或我如何才能使这项工作?
答案 0 :(得分:3)
您错过了typename
和template
:
typedef typename encapsulate_arguments<
// ^^^^^^^^
Master<L>::template Slave, pack<double, int>
// ^^^^^^^^
>::type EmbeddedType;
<强> Demo 强>