Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>I think this will do:-</p> <p>(<strong>Corrected</strong> including aschepler's test case)</p> <pre><code>#include &lt;type_traits&gt; template&lt;typename Func, typename Ret, typename... Args&gt; struct returns_a { template&lt;typename F, typename ...As&gt; static constexpr bool test( decltype(std::declval&lt;F&gt;()(std::declval&lt;As&gt;()...)) * prt) { return std::is_same&lt;Ret *,decltype(prt)&gt;::value; } template &lt;typename F, typename ...As&gt; static constexpr bool test(...) { return false; } static const bool value = test&lt;Func,Args...&gt;(static_cast&lt;Ret *&gt;(0)); }; // Testing... #include &lt;iostream&gt; void fn0(); int fn1(int); int fn2(int,int); struct cls{}; struct fntor { int operator()(int i) { return 1; } }; auto lamb0 = [](int i) -&gt; int { return i; }; struct B {}; struct D : public B {}; auto lamb1 = []{ return B{}; }; int main() { std::cout &lt;&lt; returns_a&lt;decltype(fn0),void&gt;::value &lt;&lt; std::endl; // 1 std::cout &lt;&lt; returns_a&lt;decltype(fn1),int,int&gt;::value &lt;&lt; std::endl; // 1 std::cout &lt;&lt; returns_a&lt;decltype(fn1),int,double&gt;::value &lt;&lt; std::endl; // 1 std::cout &lt;&lt; returns_a&lt;decltype(fn1),double,int&gt;::value &lt;&lt; std::endl; // 0 std::cout &lt;&lt; returns_a&lt;decltype(fn1),char,int&gt;::value &lt;&lt; std::endl; // 0 std::cout &lt;&lt; returns_a&lt;decltype(fn1),unsigned,int&gt;::value &lt;&lt; std::endl; // 0 std::cout &lt;&lt; returns_a&lt;decltype(fn2),int,int,int&gt;::value &lt;&lt; std::endl; // 1 std::cout &lt;&lt; returns_a&lt;decltype(fn2),int,char,float&gt;::value &lt;&lt; std::endl; // 1 std::cout &lt;&lt; returns_a&lt;cls,int,int&gt;::value &lt;&lt; std::endl; // 0 std::cout &lt;&lt; returns_a&lt;fntor,int,int&gt;::value &lt;&lt; std::endl; // 1 std::cout &lt;&lt; returns_a&lt;decltype(lamb0),int,int&gt;::value &lt;&lt; std::endl; // 1 std::cout &lt;&lt; returns_a&lt;double,int,int&gt;::value &lt;&lt; std::endl; // 0 std::cout &lt;&lt; returns_a&lt;decltype(lamb1), D&gt;::value &lt;&lt; std::endl; //0 return 0; } </code></pre> <p>(Built with clang 3.2, gcc 4.7.2, gcc 4.8.1)</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload