我有一个专门通过模板的Action类。我想在一个独特的std c ++集合(std :: map,std :: vector等)中存储Action类型的不同特化。
这里是Action类:
#include <iostream>
#include <functional>
#include <utility>
template<typename T, typename... Args>
class Action {
private:
std::function<T(Args...)> function;
public:
explicit Action(std::function<T(Args...)> function) : function(std::move(function)) {};
T execute(Args... args) {
return function(args...);
};
};
template<typename... Args>
class Action<void, Args...> {
private:
std::function<void(Args...)> function;
public:
explicit Action(std::function<void(Args...)> function) : function(std::move(function)) {};
void execute(Args... args) {
function(args...);
};
};
template<>
class Action<void> {
private:
std::function<void()> function;
public:
explicit Action(std::function<void()> function) : function(std::move(function)) {};
void execute() {
function();
};
};
这里有一个实时example。
问题在于我无法做到
auto action1 = Action<void>([](){std::cout << "hello world!" << std::endl;});
auto action2 = Action<void, std::string>([](std::string text){std::cout << text << std::endl;});
auto action3 = Action<void>([](){std::cout << "bluff" << std::endl;});
auto action4 = Action<int, int, int>([](int a, int b){return a + b;});
std::vector<Action> actions = {action1, action2, action3, action4};
因为向量声明中缺少Action模板特化。创建由所有Action类实现的空类接口的方法
class ActionI {};
...
std::vector<ActionI> newActions = {action1, action2, action3, action4};
不起作用,因为当我循环 newActions 向量时,我无法将单个动作转换为正确的特化。有办法解决这个问题吗?