如何将std函数作为模板参数传递给类?

时间:2016-09-12 15:12:06

标签: c++ c++11

所以我有一个这样的课程

template <typename T>
class Foo{
public:
    Foo(T& outputProcessor):
        _output(outputProcessor){}
protected:
    void processData(int data){
        std::map<std::string,int> output;

        //T(output); ??
    }
    T& _output;
};

然后我创建它:

Foo< decltype (processOutput) >(processOutput)

processOutput定义为

std::function<void(std::map<std::string, int>)> processOutput;

我可以从T拨打Foo,如果是,可以如何?

2 个答案:

答案 0 :(得分:3)

作为替代实现,您可以从T私下继承:

template <typename T>
class Foo: private T {
public:
    Foo(T outputProcessor):
        T(std::move(outputProcessor)) { }
protected:
    void processData(int data) {
        std::map<std::string,int> output;
        (*this)(output);
        // Or: T::operator()(output);
    }
};

这样,outputProcessor策略就会成为Foo类的一部分,因为它应该是。

您仍然可以构建Foo的实例,如下所示:

int main() {
    std::function<void(std::map<std::string, int>)> processOutput = [](std::map<std::string, int>){};
    Foo< decltype (processOutput) > foo(processOutput);
}

或直接使用lambda函数:

int main() {
    auto processOutput = [](std::map<std::string, int>){};
    Foo< decltype (processOutput) > foo(processOutput);
}

实际上不需要std::function

答案 1 :(得分:1)

您无法拨打TT是一种类型。你可以调用它的实例,是的。

在您的情况下,_outputT的一个实例,因此您可以将其称为普通函数:

_output(output); //Call function in '_output' and passes 'output' as parameter.