thisの質問に続いて、私は、クラスBaseSensor
のミックスインの同じ名前のメソッドをすべて呼び出すことに関連するコードをコピーして貼り付けることを避けようとしています。C++のテンプレート関数名を持つ可変テンプレート11
sensor.hpp main.cppにで
struct EdgeSensor //a mixin
{
void update(){}
void printStats() {}
};
struct TrendSensor //another mixin
{
void update(){}
void printStats() {}
};
template<typename ... SensorType>
class BaseSensor : public SensorType ... //to my BaseSensor class
{
void update() /*{ what goes in here??? }*/
void printStats() /*{ what goes in here??? }*/
};
sensor.t.hppで
template<typename ... SensorType>
void BaseSensor<SensorType...>::update()
{
int arr[] = { (SensorType::update(), 0)..., 0 };
(void)arr;
}
template<typename ... SensorType>
void BaseSensor<SensorType...>::printStats()
{
int arr[] = { (SensorType::printStats(), 0)..., 0 };
(void)arr;
}
int main(int , const char **)
{
{
BaseSensor<EdgeSensor,TrendSensor> ets;
ets.update();
ets.printStats();
}
{
BaseSensor<EdgeSensor> ets;
ets.update();
ets.printStats();
}
}
に上記のコードは、内のすべてのミックスインのupdate()
を実行しますすべてのミックスインからprintStats()
のすべてを実行する前に、オンにします。例えば
、:BaseSensor::update()
とBaseSensor::printStats()
の実装の重複を避けるため、すべてのミックスイン間で実行するために、ターゲット関数の名前を受け入れるジェネリック(テンプレート)関数を作成するために何とかできるかどう
は、私が疑問に思います私はBaseSensor::update()
とBaseSensor::printStats()
から、それを呼び出す方法runAll()
template<typename ... SensorType>
class BaseSensor : public SensorType ... //to my BaseSensor class
{
void update() /*{ what goes in here??? }*/
void printStats() /*{ what goes in here??? }*/
template<typename FnName>
void runAll(FnName f)
{
int arr[] = { (SensorType::f(), 0)..., 0 };
(void)arr;
}
};
メソッドを作成することができます。私は使用しようとしました
void update() { runAll<update>(); }
void printStats() { runAll<printStats>(); }
しかし、これは動作しません(期待していませんでした)。私が参照関数の引数は、(例えばhereなど、他の多くの質問であるとして関数名を渡すことに伴う問題は、私はBaseSensor::update()
から様々な::update()
機能を指すように方法がわからないということです。例えば
void update() { runAll<update>(update()); }
も正しくありません。
この場合はコピーを避けることができますか?これは、C++ 11を使用してコピーをたくさん避けるように(すなわち、hereのように一般的なラムダを使わずに)できますか?テンプレートパラメータは、私がどこのファイルを "sensor.t.hpp"ファイルに移動するかのように見えますか?
ありがとうございます。
リンクのみの回答が悪く、質問にも同じことが適用されます。自立するために関連する部分を追加してください。 – Jarod42
@ Jarod42 ok fixed – nass