如何在 rxcpp 自定义运算符中正确推断泛型
How to properly infer a generic in a rxcpp custom operator
我创建了一个名为 validateImplementation
的自定义 rxcpp 运算符,它应该简单地采用通用可观察流,对 SimpleInterface
进行一些验证,然后根据特定条件继续或结束流(在我的例子中,条件是 whatsMyId
)
https://github.com/cipriancaba/rxcpp-examples/blob/master/src/SimpleOperators.cpp
template <class T> function<observable<T>(observable<T>)> SimpleOperators::validateImplementation(SimpleInterface component) {
return [&](observable<T> $str) {
return $str |
filter([&](const T item) {
if (component.whatsMyId() == "1") {
return true;
} else {
return false;
}
}
);
};
}
但是,当尝试在 main.cpp
中使用 validateImplementation
方法时,出现以下错误:
no matching member function for call to 'validateImplementation'
note: candidate template ignored: couldn't infer template argument 'T'
你能帮我理解我做错了什么吗?
在 C++ 中,必须先完全解析类型,然后才能使用该函数。此外,模板参数只能从参数中推断出来,而不是 return 类型。最后,带有模板参数的函数的定义在被调用时(在 header 中)或为每个支持的类型显式实例化时(在 cpp 中)必须是可见的。
在这种情况下,我会避免显式实例化。这意味着有两种选择。
删除模板参数
function<observable<string>(observable<string>)> validateImplementation(SimpleInterface component);
将定义从 cpp 移动到 header 和 更改 main.cpp 以明确类型,因为它无法推断。
o->validateImplementation<string>(s1) |
我创建了一个名为 validateImplementation
的自定义 rxcpp 运算符,它应该简单地采用通用可观察流,对 SimpleInterface
进行一些验证,然后根据特定条件继续或结束流(在我的例子中,条件是 whatsMyId
)
https://github.com/cipriancaba/rxcpp-examples/blob/master/src/SimpleOperators.cpp
template <class T> function<observable<T>(observable<T>)> SimpleOperators::validateImplementation(SimpleInterface component) {
return [&](observable<T> $str) {
return $str |
filter([&](const T item) {
if (component.whatsMyId() == "1") {
return true;
} else {
return false;
}
}
);
};
}
但是,当尝试在 main.cpp
中使用 validateImplementation
方法时,出现以下错误:
no matching member function for call to 'validateImplementation'
note: candidate template ignored: couldn't infer template argument 'T'
你能帮我理解我做错了什么吗?
在 C++ 中,必须先完全解析类型,然后才能使用该函数。此外,模板参数只能从参数中推断出来,而不是 return 类型。最后,带有模板参数的函数的定义在被调用时(在 header 中)或为每个支持的类型显式实例化时(在 cpp 中)必须是可见的。
在这种情况下,我会避免显式实例化。这意味着有两种选择。
删除模板参数
function<observable<string>(observable<string>)> validateImplementation(SimpleInterface component);
将定义从 cpp 移动到 header 和 更改 main.cpp 以明确类型,因为它无法推断。
o->validateImplementation<string>(s1) |