c++ - 注入(inject)模板构造函数

标签 c++ templates constructor

我有这个模板,它的名字又长又难看:

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 或类似的注入(inject) 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);

关于c++ - 注入(inject)模板构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26778391/

相关文章:

c++ - 将右值引用分配给成员变量

c++ - GTK:完全摆脱系统主题/CSS

C++ 将可变参数模板参数扩展为语句

c++ - 如何正确删除模板函数中的代码重复

java - 为什么 `invokespecial`用于调用java中的 `<init>`方法?

C++判断一个变量是引用还是指针

c++ - 多态类型的代理类,使用模板

c++ - 带有initializer_list和size的std::unordered_map构造函数在main中编译,但不在类定义中编译

c++ - 构造函数中的虚方法

c++ - c++11 shared_ptr 的简单示例无法编译