我试图让两个具有相同功能的重载称为某种东西。此函数应该将另一个函数作为参数,并且应该根据此其他函数的返回类型进行重载。到目前为止,我有这个:
WebView myWebView = (WebView) findViewById(R.id.webview);
myWebView.setWebChromeClient(new WebChromeClient() {
public void onConsoleMessage(String message, int lineNumber, String sourceID) {
Log.d("MyApplication", message + " -- From line "
+ lineNumber + " of "
+ sourceID);
}
});
但是,这不会编译。这是我用gcc编译器得到的构建消息:
#include <iostream>
#include <type_traits>
using namespace std;
unsigned long function1() {
return 5;
}
void function2() {
return;
}
template <typename Algorithm, typename enable_if<is_void<decltype(Algorithm())>::value>::type* = nullptr>
void something(Algorithm a) {
std::cout << "algorithm returns void\n";
}
template <typename Algorithm, typename enable_if<!is_void<decltype(Algorithm())>::value>::type* = nullptr>
decltype(Algorithm()) something(Algorithm a) {
std::cout << "algorithm returns non-void: " << a() << "\n";
}
int main() {
something(function1);
something(function2);
}
我想在c ++中实现什么?如果是这样,怎么样?
答案 0 :(得分:1)
Algorithm
不会调用该函数,而是创建推导出的函数类型的实例。你需要另外一对括号才能称之为
decltype(Algorithm()())
甚至:
std::declval<Algorithm>()()
如果您的类型是具有无法访问的默认构造函数的仿函数。