C++ Template 模板实例化
C++ Template Template Instantiation
我有以下可变参数包的封装代码。
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;
};
这甚至可能吗和/或我怎样才能让它发挥作用?
您缺少 typename
和 template
:
typedef typename encapsulate_arguments<
// ^^^^^^^^
Master<L>::template Slave, pack<double, int>
// ^^^^^^^^
>::type EmbeddedType;
我有以下可变参数包的封装代码。
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;
};
这甚至可能吗和/或我怎样才能让它发挥作用?
您缺少 typename
和 template
:
typedef typename encapsulate_arguments<
// ^^^^^^^^
Master<L>::template Slave, pack<double, int>
// ^^^^^^^^
>::type EmbeddedType;