Confused? Я тоже ... Рассмотрим следующийИнициализация нечлена в списке инициализаторов конструктора
typedef std::map<std::string , double> Thresholds;
class Foo
{
public:
Foo(const double & _toxicThres , const double & _zeroThres)
: thresholds
(
MapInitializer<std::string , double>()
.Add("toxic" , _toxicThres)
.Add("zero" , _zeroThres)
)
private:
Thresholds thresholds;
};
выше работает отлично и инициализирует std::map
в списке член инициализации конструктора. Теперь рассмотрим это:
typedef std::map<std::string , double> Thresholds;
struct CommonData
{
Thresholds thresholds;
};
class Foo //a mixin
{
public:
Foo(Thresholds & thresholds , const double & _toxicThres , const double & _zeroThres)
: thresholds
(
MapInitializer<std::string , double>()
.Add("toxic" , _toxicThres)
.Add("zero" , _zeroThres)
)
};
class Bar //another mixin
{
public:
Bar(Thresholds & thresholds , const double & _warningThres , const double & _zeroThres)
: thresholds
(
MapInitializer<std::string , double>()
.Add("warning" , _warningThres)
.Add("zero" , _zeroThres)
)
};
class OtherGasThreshold{/*...*/}; //yet another mixin, etc...
template<typename ThresholdMixin> //Foo , Bar , or others ...
class ThresholdSensor : public ThresholdMixin
{
public:
ThresholdSensor(double val1 , double val2)
: ThresholdMixin(cd.thresholds, val1 , val2)
{}
private:
CommonData cd;
};
Обратите внимание, что MapIniializer
код приходит от here, и
template<class K, class V>
class MapInitializer
{
std::map<K,V> m;
public:
operator std::map<K,V>() const
{
return m;
}
MapInitializer& Add(const K& k, const V& v)
{
m[ k ] = v;
return *this;
}
};
Конечно выше, не будет компилировать, но есть ли способ, чтобы инициализировать карту в ThresholdSensor::CommonData
в одном миксинов во время инициализации конструктора. т.е. могу ли я передать ссылку на карту, инициализировать ее в конструкторе mixins?
true true fixed – nass
Знаете ли вы, что «MapInitializer» совершенно не нужен для этого кода? Просто используйте 'initializer_list' –
@MooingDuck еще лучше, используйте готовые инициализаторы –