gpt4 book ai didi

c++ - 为什么 decltype(declval().func()) 在 decltype(&T::func) 不工作的地方工作?

转载 作者:可可西里 更新时间:2023-11-01 16:38:36 28 4
gpt4 key购买 nike

我试图检测成员函数 baz() 的存在在模板参数中:

template<typename T, typename = void>
struct ImplementsBaz : public std::false_type { };

template<typename T>
struct ImplementsBaz<T, decltype(&T::baz)> : public std::true_type { };

但它总是产生错误:

struct Foo {};
struct Bar { void baz() {} };

std::cout << ImplementsBaz<Foo>::value << std::endl; // 0
std::cout << ImplementsBaz<Bar>::value << std::endl; // also 0

使用 declval不过,调用该方法确实有效:

template<typename T>
struct ImplementsBaz<T, decltype(std::declval<T>().baz())> : public std::true_type { };

当然,现在这个只能检测一个baz具有 0 个参数的函数。 为什么在使用declval<T>().baz()时选择的专业是正确的? , 但不是 decltype(&T::baz) ?

最佳答案

如果您使用 void_t “检测成语”,然后它确实按预期工作:

template <typename...> using void_t = void;

template <typename T>
struct ImplementsBaz<T, void_t<decltype(&T::baz)>> : std::true_type {};


struct Bar { void baz() {} };

static_assert(ImplementsBaz<Bar>::value); // passes

Godbolt link

至于为什么this question详细解释了“void_t 技巧”是如何工作的。引用已接受的答案:

It's as if you had written has_member<A, void>::value. Now, the template parameter list is compared against any specializations of the template has_member. Only if no specialization matches, the definition of the primary template is used as a fall-back.

在原来的情况下,decltype(&T::baz)不是 void ,所以特化与原始模板不匹配,因此不予考虑。我们需要使用 void_t (或其他一些机制,例如强制转换)将类型更改为 void以便使用特化。

关于c++ - 为什么 decltype(declval<T>().func()) 在 decltype(&T::func) 不工作的地方工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45310397/

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