nasıl şablon argümanları tekrarlamadan (ve makro kullanmadan) bir şablon temel sınıfından Kurucular miras yok: ÖrneğinŞablon bağımsız değişkenlerini tekrar etmeden şablon taban sınıfındaki kurucuları mi saklıyorsunuz?
, bu (GCC 4.8 kullanarak) çalışmaz:
template <typename T>
struct base {};
template <typename U>
struct derived : base<U> {
using base::base;
};
It does Ben temel sınıf şablon argümanları tekrar çalışmayabilir:
template <typename T>
struct base {};
template <typename U>
struct derived : base<U> {
using base<U>::base;
};
sorun "u" çok karmaşık bir şey olabilir ve bu can sıkıcı ve hata tekrarlamak eğilimli olmasıdır.
#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
bu yaklaşım daha iyi bir yolu var mı:
#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 ;
};
Ben makro kullanarak bu sorunu çalışma sona erdi: Örneğin, burada benim orijinal motive örneklerinden biridir? Bazı sözdizimi numarası eksik mi? =)
'typedef base parent;' –
@MooingDuck Yine de en az iki kez yinelemeniz gerekir (bir kez ve türetmek için '' 'yapıcıları devralmak için ''. – Zereges