gpt4 book ai didi

c++ - 自定义成员检测器中的模糊调用

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:16:34 25 4
gpt4 key购买 nike

我正在自己实现成员检测器以提高我的编程技能。下面的代码用 g++ 编译得很好但是 clang++ 拒绝代码,错误是:

error: call to 'check' is ambiguous main.cpp:19:17: note: candidate function [with U = has_member::HasIt]

static char check( decltype(U::i)* );

main.cpp:22:16: note: candidate function [with U = has_member::HasIt]

static int check(U*);

这是类的代码

template<typename T>
struct has_member
{

struct Fallback
{
int i;
};

struct HasIt : Fallback, T
{};

template<class U>
static char check( decltype(U::i)* );

template<typename U>
static int check(U*);

static const bool value = sizeof(check<HasIt>( nullptr ) ) == sizeof(int);
};

class Test
{
public:

};

int main()
{
auto v = has_member<Test>::value;

std::cout << std::boolalpha << v;
}

实例 here

问题是:代码是否有效?如果这是 g++ 接受它的原因?

最佳答案

代码应该是有效的。我们有两个可行的候选人:

template <class U>
static char check( decltype(U::i)* ); // --> int*

template <class U>
static int check( U* ); // --> HasIt*

nullptr 可转换为两种指针类型,两种转换都不比另一种更好,两种候选者都是函数模板。但前者比后者更专业,所以应该优先考虑。这是一个 clang 错误。

一种适用于两种编译器的简单解决方法是将第二个重载更改为:

template<typename U>
static int check(...);

由于任何东西都比省略号更受欢迎,这仍然是后备选项,而不必依赖模板偏序规则。

此外,由于我们在 C++11 中,我们可以直接使用返回类型:

template<class U>
static std::false_type check( decltype(U::i)* );

template<typename U>
static std::true_type check(...);

using type = decltype(check<HasIt>(nullptr));
static constexpr bool value = type::value;

关于c++ - 自定义成员检测器中的模糊调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32872387/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com