【发布时间】:2016-09-19 00:23:13
【问题描述】:
在this 问题之后,我试图避免复制粘贴一些与调用BaseSensor 类的所有同名方法相关的代码。
在sensor.hpp中
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;
}
在 main.cpp 中
int main(int , const char **)
{
{
BaseSensor<EdgeSensor,TrendSensor> ets;
ets.update();
ets.printStats();
}
{
BaseSensor<EdgeSensor> ets;
ets.update();
ets.printStats();
}
}
上面的代码依次执行所有mixin的update(),然后继续执行所有mixin的所有printStats()。
我想知道是否有可能避免重复执行 BaseSensor::update() 和 BaseSensor::printStats() 并创建一个通用(模板)函数,该函数接受目标函数的名称以在所有 mixins 中执行:
例如,我可以创建一个方法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;
}
};
我将如何从BaseSensor::update() 和BaseSensor::printStats() 调用它。我尝试过使用
void update() { runAll<update>(); }
void printStats() { runAll<printStats>(); }
但这不起作用(没想到会这样)。将函数名称作为函数参数传递的问题(我看到许多其他问题,例如here 是我不知道如何从BaseSensor::update() 指向各种::update() 函数。例如
void update() { runAll<update>( update() ); }
也不正确。
在这种情况下是否可以避免复制?这可以在单行中完成,以避免使用 c++11 进行大量复制(即不使用通用 lambda,就像 here 所做的那样)?如果我将工作的runAll() 移动到文件“sensor.t.hpp”中,模板参数会是什么样子?
谢谢。
【问题讨论】:
-
仅链接的答案不好,同样适用于问题。添加相关部分以自给自足。
-
@Jarod42 好的修复
标签: c++ templates c++11 variadic-templates variadic-functions