SFINAE返回型过载

时间:2015-04-27 10:23:26

标签: c++ templates sfinae

我试图让两个具有相同功能的重载称为某种东西。此函数应该将另一个函数作为参数,并且应该根据此其他函数的返回类型进行重载。到目前为止,我有这个:

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 ++中实现什么?如果是这样,怎么样?

1 个答案:

答案 0 :(得分:1)

Algorithm不会调用该函数,而是创建推导出的函数类型的实例。你需要另外一对括号才能称之为

decltype(Algorithm()())

甚至:

std::declval<Algorithm>()()

如果您的类型是具有无法访问的默认构造函数的仿函数。