据我了解,函数名称使用的结果可能是以下之一:
- 没有(最好的)可行的功能——重载决议失败。子结果是:
- 没有候选人。
- 有一些候选人,但没有一个是可行的。
- 只有一个最佳可行功能——重载决议成功。然后选择的过载是
- 好的——整体调用格式正确。
- 不好(
= delete
d,protected
/private
或者,也许是别的东西)——整个调用格式不正确。
- 最好的可行函数不止一种——重载决议因模棱两可而失败。
问题是:在通过类型特征隐式使用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>);
请注意,通常对参数和参数的类型一无所知。