C ++中可变参数模板类的容器

问题描述 投票:0回答:1

我正在尝试为返回类型为std::function且参数数目为void可变的std::string编写包装。

template<class... Args>
class ConsoleCommand
{
    public:
        ConsoleCommand(const std::string& name, const std::function<void(Args...)>& function) :
            name{ name },
            function{ function }
        {

        }

        void operator()(Args... args)
        {
            function(std::forward<Args>(args)...);
        }
    private:
        std::string name;
        std::function<void(Args...)> function;
};

所以这正常工作,除了必须将函数的通用性根植到实例的类型这一事实之外,我正在努力避免这种情况。

ConsoleCommand<std::string> ex1; //unary function
ConsoleCommand<std::string, std::string> ex2; //dyadic function

我想拥有这些对象的容器,(std::vector<ConsoleCommand<std::string>>),如果我可以使类模板参数仅引用参数的类型,而不是整个包,那真的很整洁。

template<class Args>
class ConsoleCommand
{
    public:
        ConsoleCommand(const std::string& name, const std::function<void(Args...)>& function) :
            name{ name },
            function{ function }
        {

        }

        void operator()(Args... args)
        {
            function(std::forward<Args>(args)...);
        }
    private:
        std::string name;
        std::function<void(Args...)> function;
};

我尝试过,但是没有用。我要实现的目标是否有任何解决方法?

c++ templates variadic-templates
1个回答
0
投票

您可以考虑使用类型擦除,这是在运行时类型信息/多态下隐藏模板的常用方法。

© www.soinside.com 2019 - 2024. All rights reserved.