考虑以下代码,该代码定义要作为模板模板参数传递的别名模板:
template<template<class T> class SomeFoo>
class Base {};
template<class T, class Bar>
class Foo {};
class Bar;
template<class T>
using BarFoo = Foo<T, Bar>;
class Bar : public Base<BarFoo> {};
这可以按预期工作。但是,如果Bar
本身是模板,则无法使用此解决方案,因为别名模板依赖于Bar
的具体实例化。在Bar
内定义别名模板也无济于事,因为在给定基类时它尚不可用。由于似乎无法在参数列表中“动态”定义别名模板,因此我唯一可以解决的问题是将Bar
传递给Base
并定义别名模板有:
template<template<class T, class Derived> class SomeFooTL, class Derived>
class Base
{
template<class T>
using SomeFoo = SomeFooTL<T, Derived>;
};
template<class T, class Bar>
class Foo {};
template<class S>
class Bar : public Base<Foo, Bar<S>> {};
然而,这是非常不满意的,因为除了Foo
之外,其他T
可能不会依赖于任何其他CoInitialize/Ex
,现在被迫采取不必要的第二个模板参数
有谁知道更好的方法来实现这个目标?
答案 0 :(得分:2)
如果我理解你想要的是什么,你需要一个助手,并使用一个不明显的语法:
template<template<class> class>
class Base {};
template<class, class>
class Foo {};
template <typename> class Bar;
template <typename S> struct UsingHelper {
template <typename T>
using BarFoo = Foo<T, Bar<S>>;
};
template <typename S>
class Bar : public Base<UsingHelper<S>::template BarFoo> {};
template
中需要{p> UsingHelper<S>::template BarFoo
,因为它是一个依赖的上下文,它将被解释为#34;作为价值而不是。 (它类似于typename my_class<T>::type
,但BarFoo
是模板,而不是类型。)
答案 1 :(得分:0)
而不是:
template<template<class T> class SomeFoo>
class Base {};
你可能想要:
template<class SomeFooT>
class Base {};
并使用SomeFooT::type<T>
作为模板:
struct BarFooT {
template<typename T>
using type = ...;
};
然后您可以预先声明struct BarFooT;
。