gpt4 book ai didi

c++ - 如果为 false,则 std::is_member_function_pointer 不编译

转载 作者:可可西里 更新时间:2023-11-01 15:46:11 24 4
gpt4 key购买 nike

我在寻找什么:我有一个模板化类,如果该类具有所需的函数,我想调用一个函数,例如:

template<class T> do_something() {
if constexpr (std::is_member_function_pointer<decltype(&T::x)>::value) {
this->_t->x(); // _t is type of T*
}
}

会发生什么:如果 T 没有带来函数,编译器就不会编译。小例子:

#include <type_traits>
#include <iostream>

class Foo {
public:
void x() { }
};

class Bar { };

int main() {
std::cout << "Foo = " << std::is_member_function_pointer<decltype(&Foo::x)>::value << std::endl;
std::cout << "Bar = " << std::is_member_function_pointer<decltype(&Bar::x)>::value << std::endl;
return 0;
}

编译器说:

is_member_function_pointer.cpp:17:69: error: no member named 'x' in 'Bar'; did you mean 'Foo::x'?
std::cout << "Bar = " << std::is_member_function_pointer<decltype(&Bar::x)>::value << std::endl;

那么,当我不能在 if constexpr 中使用它时,std::is_member_function_pointer 有什么用?如果我只使用 this->_t->x(),编译器肯定也会失败。

最佳答案

is_member_function_pointer 没有检测到实体 T::x 的存在,它假设它检测到并返回它是否是一个成员函数指针。

如果要检测是否存在,可以使用detection idiom .示例:

#include <experimental/type_traits>

template<class T>
using has_x = decltype(&T::x);

template<class T> void do_something(T t) {
if constexpr (std::experimental::is_detected<has_x, T>::value) {
t.x();
}
}

struct Foo {
void x() { }
};

struct Bar { };

int main() {
do_something(Foo{});
do_something(Bar{});
}

live example on godbolt.org


我写了一篇关于在不同 C++ 标准版本中检查表达式有效性的一般问题的文章:

"checking expression validity in-place with C++17"

关于c++ - 如果为 false,则 std::is_member_function_pointer 不编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55161832/

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