wjl*_*wjl 8 c++ inheritance templates constructor c++11
如何从模板基类继承构造函数而不重复模板参数(并且不使用宏):
例如,这不起作用(使用GCC 4.8):
template <typename T>
struct base {};
template <typename U>
struct derived : base<U> {
using base::base;
};
Run Code Online (Sandbox Code Playgroud)
如果我重复基类的模板参数,它确实有效:
template <typename T>
struct base {};
template <typename U>
struct derived : base<U> {
using base<U>::base;
};
Run Code Online (Sandbox Code Playgroud)
问题是"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 ;
};
Run Code Online (Sandbox Code Playgroud)
我最后通过使用宏来解决这个问题:
#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
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来解决这个问题?我遗漏了一些语法技巧?=)
它并不完美,但您可以有一个生成您的类型的类:
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 ;
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2941 次 |
| 最近记录: |