将别名模板传递给模板的基类依赖于

时间:2017-10-11 13:28:58

标签: c++ c++11 templates

考虑以下代码,该代码定义要作为模板模板参数传递的别名模板:

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,现在被迫采取不必要的第二个模板参数

有谁知道更好的方法来实现这个目标?

2 个答案:

答案 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;