正在注入模板构造函数

Injecting template constructor

本文关键字:构造函数 注入      更新时间:2023-10-16

我有这个模板,它最终有一个很长很尴尬的名字:

template <class A>
struct foo {
    template <class B>
    struct bar {
        template <class L>
        struct baz {
            template <int N>
            class MyTemplate {
            public:
                MyTemplate(A a, B b);
            };
        };
    };
};

嵌套结构在实现中是有意义的(隐藏在这个玩具示例中),所以我不想更改它。现在每次我想使用模板时,我都需要编写foo<int>::bar<float>::baz<float>::MyTemplate<5>。我知道我能做到:

template <class A, class B, class L, int N>
class MyTemplate_Shortcut : public foo<A>::bar<B>::baz<L>::MyTemplate<N> {
    // ...
};

问题是MyTemplate的构造函数现在被隐藏了。不幸的是,不同的实例化可能具有不同的构造函数签名,因此不可能编写一个构造函数来调用所有构造函数。我也可以这样做:

template <class A, class B, class L, int N>
struct MyTemplate_Shortcut { {
    typedef foo<A>::bar<B>::baz<L>::MyTemplate<N> MyTemplate;
};

现在我可以做MyTemplate_Shortcut<int, float, float, 5>::MyTemplate了,它更好,但不是很完美。有没有什么技巧,比如CRTP或类似的技巧,将MyTemplate的构造函数注入MyTemplate_Shortcut?我知道在C++11中,有一个简单的模板别名解决方案:

template <class A, class B, class L, int N> using MyTemplate_Shortcut =
    foo<A>::bar<B>::baz<L>::MyTemplate<N>;

请注意,我对语法不是特别确定,因为我以前没有使用过它。有没有一种非C++11的方法可以做到这一点?

我提出了以下解决方案,该解决方案使用typedef来短切嵌套的模板类。

...
template <class A, class B, class L, int N>
struct MyTemplate_Shortcut  {
typedef class foo<A>::bar<B>::baz<L>::MyTemplate<N> Type;
};
MyTemplate_Shortcut<int, long, float, 5>::Type instance(5, 17);