다음은 this 질문입니다. 나는 BaseSensor
클래스의 mixins에서 같은 이름의 모든 메소드를 호출하는 것과 관련된 일부 코드를 복사하여 붙여 넣는 것을 피하려고합니다. MAIN.CPP에 sensor.hpp sensor.t.hppC++ 용 템플릿 함수 이름을 가진 가변 템플릿들 012
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;
}
에
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??? }*/
};
에
는
int main(int , const char **)
{
{
BaseSensor<EdgeSensor,TrendSensor> ets;
ets.update();
ets.printStats();
}
{
BaseSensor<EdgeSensor> ets;
ets.update();
ets.printStats();
}
}
상기 코드는 모든 유지 mixin의 update()
에서 실행 모든 mixins에서 모든 printStats()
을 실행하기 전에 계속하십시오. 예를 들어
:이 BaseSensor::update()
및 BaseSensor::printStats()
의 구현을 중복되지 않도록 모든 유지 mixin에 걸쳐 실행하는 대상 함수의 이름을 받아 일반 (템플릿) 함수를 만들 든 가능한 경우
이 궁금해 나는 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"파일로 작업 할 곳을 runAll()
으로 이동하는 것처럼 보입니까?
고맙습니다.
링크 전용 답변이 나쁘고 질문에 대해서도 동일하게 적용됩니다. 자급 자족 할 수 있도록 관련 부분을 추가하십시오. – Jarod42
@ Jarod42 ok ok – nass