gpt4 book ai didi

c++ - 如何使用 `is_member_function_pointer`来包含/排除算法中的成员函数调用?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:46:00 24 4
gpt4 key购买 nike

我正在尝试使用 is_member_function_pointer在一个算法中,要么调用一个类型的特定成员函数(如果它存在),要么什么也不做:

template< class T >
struct is_member_function_pointer;

Checks whether T is a non-static member function pointer. Provides the member constant value which is equal to true, if T is a non-static member function pointer type. Otherwise, value is equal to false.

例如:

#include <iostream>
#include <type_traits>
#include <vector>

struct A
{
void boo() const { std::cout << "boo." << std::endl; }
};

struct B {};

template<bool> struct booable;

template<>
struct booable<true> {

template<typename Type>
static void booIt(Type const & t)
{
t.boo();
}
};

template<>
struct booable<false> {

template<typename Type>
static void booIt(Type const & t)
{
std::cout << "booing a non-booable type" << std::endl;
}
};

template<typename Type>
void alg(Type const& t)
{
booable<std::is_member_function_pointer<decltype(&Type::boo)>::value>::booIt(t);
}

int main(int argc, const char *argv[])
{
A a;
B b;

alg(a);
alg(b);

return 0;
}

结构 AbooableB 不是。在算法 alg 中,is_member_function_pointer bool 值设置为 falsetrue 取决于事实 if 类型实现了一个成员函数boo。这个 bool 值然后用于专门化 booable 结构,它实现了 booIt 静态成员函数,其唯一目的是调用 boo booable 对象,或者什么都不做并通知用户

但是,编译它(保存在 main.cpp 中)会导致以下编译时错误:

main.cpp: In instantiation of ‘void alg(const Type&) [with Type = B]’:
main.cpp:46:10: required from here
main.cpp:37:54: error: ‘boo’ is not a member of ‘B’
booable<std::is_member_function_pointer<decltype(&Type::boo)>::value>::booIt(t);

这让我想知道:不是将此报告为可用的 bool 值而不是编译时错误这个特征结构的重点吗?这与我简单地做会得到的错误相同

B b; 
b.boo();

我做错了什么?

最佳答案

Isn't reporting this as a useable boolean value and not a compile-time error the point of this trait structure?

是的,但是为了测试某个类的某个成员,该成员需要存在。

你得到错误是因为 B 没有 boo 并且实例化 alg 导致 decltype(&B::boo) 。您不会期望 decltype(&int::foo) 可以编译,对吗?

您需要的是检查成员存在 的特征。见

例如。

您可以使用检查的结果来专门化做进一步测试的模板。

编辑:

这是使用表达式 SFINAE 检查 boo 的简单方法:

template<typename T>
constexpr auto is_booable(int) -> decltype(std::declval<T>().boo(), bool())
{
return true;
}

template<typename T>
constexpr bool is_booable(...)
{
return false;
}

用法:

booable< is_booable<Type>(0) >::booIt(t);

Live example .

关于c++ - 如何使用 `is_member_function_pointer`来包含/排除算法中的成员函数调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21827556/

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