C ++在独特的std集合中存储具有不同特化的类模板对象

时间:2018-03-25 10:13:51

标签: c++ templates stl variadic-templates c++17

我有一个专门通过模板的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 向量时,我无法将单个动作转换为正确的特化。有办法解决这个问题吗?

0 个答案:

没有答案