c++ - 从模板基类继承构造函数而不重复模板参数?

标签 c++ templates inheritance c++11 constructor

如何在不重复模板参数(并且不使用宏)的情况下从模板基类继承构造函数:

例如,这不起作用(使用 GCC 4.8):

template <typename T>
struct base {};

template <typename U>
struct derived : base<U> {
    using base::base;
};

如果我重复基类的模板参数,它确实有效:

template <typename T>
struct base {};

template <typename U>
struct derived : base<U> {
    using base<U>::base;
};

问题是“U”可能是非常复杂的东西,这很烦人并且容易重复错误。例如,这是我最初的激励示例之一:

#include <boost/multi_index_container.hpp>
#include <boost/multi_index/key_extractors.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <boost/multi_index/sequenced_index.hpp>

using namespace boost::multi_index;

struct as_list_tag {};
struct as_set_tag  {};

template <typename T>
struct unique_list : multi_index_container <
    T,
    indexed_by <
        sequenced<tag<as_list_tag>>,
        ordered_unique<tag<as_set_tag>, identity<T>>
    >
> {
    using multi_index_container <
        T,
        indexed_by <
            sequenced<tag<as_list_tag>>,
            ordered_unique<tag<as_set_tag>, identity<T>>
        >
    >
    ::multi_index_container;
    using as_list = as_list_tag;
    using as_set  = as_set_tag ;
};

我最终通过使用宏解决了这个问题:

#define MAKE_UNIQUE_LIST(template_params...)\
template <typename T>\
struct unique_list : multi_index_container template_params\
{\
    using multi_index_container template_params ::multi_index_container;\
    using as_list = as_list_tag;\
    using as_set  = as_set_tag ;\
};

MAKE_UNIQUE_LIST(<
    T,
    indexed_by <
        sequenced<tag<as_list_tag>>,
        ordered_unique<tag<as_set_tag>, identity<T>>
    >
>)
#undef MAKE_UNIQUE_LIST

有没有更好的方法来解决这个问题?我缺少一些语法技巧? =)

最佳答案

它并不完美,但您可以拥有一个生成您的类型的类:

template <typename T>
struct unique_list_base {
    typedef multi_index_container <
        T,
        indexed_by <
            sequenced<tag<as_list_tag>>,
            ordered_unique<tag<as_set_tag>, identity<T>>
        >
    > type;
};

template <typename T>
struct unique_list : unique_list_base<T>::type {
    using unique_list_base<T>::type::multi_index_container;
    using as_list = as_list_tag;
    using as_set  = as_set_tag ;
};

关于c++ - 从模板基类继承构造函数而不重复模板参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15801630/

相关文章:

c++ - 初始化类的静态常量非整型数据成员

c++ - 将目标文件放入单独的文件夹中 GNU make

c++ - 将模板函数指针转换为 bool 失败

c++ - 让模板通过指定 bitesize 在 char/short/int 之间进行选择?

ios - 指定初始化程序?

android - OpenGL ES 2.0 与 OpenGL 3 - 异同

C++模板函数

java - 如何绘制正确的类图?

python - 无法使用基类创建其子类的实例

C++ 错误 C2893 : Failed to specialize function template