#include <tuple>
#include <utility>
template<typename Func, typename R, typename Args, typename=void>
struct will_return_helper: std::false_type {};
template<typename Func, typename R, typename... Args>
struct will_return_helper<
Func, R, std::tuple<Args...>,
typename std::enable_if<
std::is_same<
R,
decltype( std::declval<Func&>()( std::declval<Args>()... ) )
>::value
>::type
>
: std::true_type {};
template<typename Func, typename R, typename... Args>
struct will_return: will_return_helper< typename std::decay<Func>::type, R, std::tuple<Args...> > {};
#include <iostream>
struct Foo {
int operator()(double) {return 0;}
};
int main()
{
std::cout << "1 = "<< will_return< int(), int >::value << "\n";
std::cout << "1 = "<< will_return< int(*)(), int >::value << "\n";
std::cout << "0 = "<< will_return< int(*)(), double >::value << "\n";
std::cout << "1 = "<< will_return< Foo, int, double >::value << "\n";
std::cout << "1 = "<< will_return< Foo, int, int >::value << "\n";
std::cout << "0 = "<< will_return< Foo, double, int >::value << "\n";
}
I2luY2x1ZGUgPHR1cGxlPgojaW5jbHVkZSA8dXRpbGl0eT4KCnRlbXBsYXRlPHR5cGVuYW1lIEZ1bmMsIHR5cGVuYW1lIFIsIHR5cGVuYW1lIEFyZ3MsIHR5cGVuYW1lPXZvaWQ+CnN0cnVjdCB3aWxsX3JldHVybl9oZWxwZXI6IHN0ZDo6ZmFsc2VfdHlwZSB7fTsKCnRlbXBsYXRlPHR5cGVuYW1lIEZ1bmMsIHR5cGVuYW1lIFIsIHR5cGVuYW1lLi4uIEFyZ3M+CnN0cnVjdCB3aWxsX3JldHVybl9oZWxwZXI8CiAgRnVuYywgUiwgc3RkOjp0dXBsZTxBcmdzLi4uPiwKICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKICAgIHN0ZDo6aXNfc2FtZTwKICAgICAgUiwKICAgICAgZGVjbHR5cGUoIHN0ZDo6ZGVjbHZhbDxGdW5jJj4oKSggc3RkOjpkZWNsdmFsPEFyZ3M+KCkuLi4gKSApCiAgICA+Ojp2YWx1ZQogID46OnR5cGUKPgo6IHN0ZDo6dHJ1ZV90eXBlIHt9OwoKdGVtcGxhdGU8dHlwZW5hbWUgRnVuYywgdHlwZW5hbWUgUiwgdHlwZW5hbWUuLi4gQXJncz4Kc3RydWN0IHdpbGxfcmV0dXJuOiB3aWxsX3JldHVybl9oZWxwZXI8IHR5cGVuYW1lIHN0ZDo6ZGVjYXk8RnVuYz46OnR5cGUsIFIsIHN0ZDo6dHVwbGU8QXJncy4uLj4gPiB7fTsKCiNpbmNsdWRlIDxpb3N0cmVhbT4Kc3RydWN0IEZvbyB7CiAgaW50IG9wZXJhdG9yKCkoZG91YmxlKSB7cmV0dXJuIDA7fQp9OwppbnQgbWFpbigpCnsKICBzdGQ6OmNvdXQgPDwgIjEgPSAiPDwgd2lsbF9yZXR1cm48IGludCgpLCBpbnQgPjo6dmFsdWUgPDwgIlxuIjsKICBzdGQ6OmNvdXQgPDwgIjEgPSAiPDwgd2lsbF9yZXR1cm48IGludCgqKSgpLCBpbnQgPjo6dmFsdWUgPDwgIlxuIjsKICBzdGQ6OmNvdXQgPDwgIjAgPSAiPDwgd2lsbF9yZXR1cm48IGludCgqKSgpLCBkb3VibGUgPjo6dmFsdWUgPDwgIlxuIjsKICBzdGQ6OmNvdXQgPDwgIjEgPSAiPDwgd2lsbF9yZXR1cm48IEZvbywgaW50LCBkb3VibGUgPjo6dmFsdWUgPDwgIlxuIjsKICBzdGQ6OmNvdXQgPDwgIjEgPSAiPDwgd2lsbF9yZXR1cm48IEZvbywgaW50LCBpbnQgPjo6dmFsdWUgPDwgIlxuIjsKICBzdGQ6OmNvdXQgPDwgIjAgPSAiPDwgd2lsbF9yZXR1cm48IEZvbywgZG91YmxlLCBpbnQgPjo6dmFsdWUgPDwgIlxuIjsKfQ==