6

据我了解,函数名称使用的结果可能是以下之一:

  1. 没有(最好的)可行的功能——重载决议失败。子结果是:
    1. 没有候选人。
    2. 有一些候选人,但没有一个是可行的。
  2. 只有一个最佳可行功能——重载决议成功。然后选择的过载是
    1. 好的——整体调用格式正确。
    2. 不好(= deleted, protected/private或者,也许是别的东西)——整个调用格式不正确。
  3. 最好的可行函数不止一种——重载决议因模棱两可而失败。

问题是:在通过类型特征隐式使用operator ()(ie )的情况下,如何可靠地将结果 #2.2(至少其中一些情况)与结果 #1.2 和 #3(至少其中一个)区分开来c(a...)接受c要在调用中使用的参数类型(包括 )?

(我对结果 #1.1 和 #2.1 不感兴趣,因为我知道 #1.1 不适用于我的特定用例,并且 #2.1 很容易通过 SFINAE 检测到。)


一个具体的例子。如何实现类似于以下内容的类型特征

/// Would `c(a...)` result in exactly one best viable candidate?
/// (Where `decltype(c)`, `decltype(a)...` are `C`, `A...`, respectively.)
template<class C, typename... A>
inline constexpr bool has_exactly_one_best_viable_call_candidate;

所以以下断言成立?

struct WithNoViable {
    void operator ()(void *);
};

struct WithDeleted {
    void operator ()(long) = delete;
};

struct WithAmbiguity {
    void operator ()(long);
    void operator ()(long long);
};

static_assert(!has_exactly_one_best_viable_call_candidate<WithNoViable, int>);
static_assert( has_exactly_one_best_viable_call_candidate<WithDeleted, int>);
static_assert(!has_exactly_one_best_viable_call_candidate<WithAmbiguity, int>);

请注意,通常对参数和参数的类型一无所知。

4

0 回答 0