相关疑难解决方法(0)

"anti-SFINAE"如果给定的表达式*格式不正确则启用重载

如果特定表达式格式不正确,则很容易使用SFINAE来隐藏特定的函数重载.但我想反其道而行之,隐藏过载,当且仅当一个表达式良好的,并在一个非常普遍的方式这样做.我有一个在clang 3.5.0和gcc 5.2.0中工作的解决方案,但我对任何评论和替代方案感兴趣.

理想情况下,会有一个内置constexpr bool函数/宏在编译时告诉我们特定表达式是否形成良好.

IS_WELL_FORMED(  declval<T>() < declval<T>()  )  // I want this as bool
Run Code Online (Sandbox Code Playgroud)

可用于enable_if启用或禁用重载.

我找到了一个解决方案,但是我在g ++ 5.2.0和clang 3.5.0中遇到了一些奇怪的行为,我想知道是否有错误.


建议的解决方案

首先,我到目前为止找到的最强大的解决方案,适用于两个编译器.例如,我想测试是否T.length()方法.这需要将表达式"隐藏"在另一个模板中.此外,well_formed_default我将在稍后讨论一个函数.

    // Define a template to contain our expression
    template<typename T2=T, typename = 
        decltype( declval<T2>().length() ) // This line is the expression to test
    > struct test_for_length_method { };
Run Code Online (Sandbox Code Playgroud)

以下是它在包含类中的使用方式:

template<typename T>
struct Demo { // the main struct I'm working on

    // Define a template …
Run Code Online (Sandbox Code Playgroud)

c++ sfinae c++11

5
推荐指数
1
解决办法
348
查看次数

标签 统计

c++ ×1

c++11 ×1

sfinae ×1