如果特定表达式格式不正确,则很容易使用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)