所以我有一个这样的课程
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
,如果是,可以如何?
答案 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)
您无法拨打T
,T
是一种类型。你可以调用它的实例,是的。
在您的情况下,_output
是T
的一个实例,因此您可以将其称为普通函数:
_output(output); //Call function in '_output' and passes 'output' as parameter.