混乱していますか?私はあまりにも... は正常に動作し、コンストラクタのメンバー初期化リストにstd::map
を初期化し、上記次コンストラクタの初期化子リストのメンバでない初期化
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;
};
を考えてみましょう。今、このことを考慮してください。
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
でマップを初期化するためにどのような方法があることコンストラクタinit中のミックスインの数。つまりマップを参照して渡すことができますか?それをmixinsコンストラクタで初期化しますか?
true true固定 – nass
このコードでは 'MapInitializer'は完全に不要であることをご存知ですか? –
@MooingDuckをもっと良く使うには、括弧付きの初期化子を使用してください。 –