- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试使用 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;
}
结构 A
是 booable 而 B
不是。在算法 alg
中,is_member_function_pointer
bool 值设置为 false
或 true
取决于事实 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/
我正在尝试实现我自己的 is_member_function_pointer,但遇到了问题。 namespace __implementation { // integral_constant
我指的是 std::is_member_function_pointer 的可能实现 here . template struct is_member_function_pointer_helper
我正在查看如何仅在函数存在时调用函数的答案,并在这个问题上找到了一些代码 Is it possible to write a template to check for a function's ex
我正在尝试使用 is_member_function_pointer在一个算法中,要么调用一个类型的特定成员函数(如果它存在),要么什么也不做: template struct is_member_f
我有一个模板,其中包含与此类似的声明: template class blah {}; 我有两个版本的模板,当Arg0是成员函数指针时我想使用一个,否则使用另一个。我正在尝试使用 std::enab
我在使用 std::is_member_function_pointer 时遇到问题。据我所知,在给定 noexcept 成员函数时它不起作用。我在标准中找不到任何声明它不适用于 noexcept 合
std::is_member_function_pointer 在 cppreference 上的使用示例使用 & 符号,我在理解语法方面有些困难。 #include class A { v
我正在尝试使用 C++ 中的 SFINAE 来创建一个通用的容器插入器模板函数,我认为考虑以下因素的模板构造 // replace T::nonexistent_member with whateve
我在寻找什么:我有一个模板化类,如果该类具有所需的函数,我想调用一个函数,例如: template do_something() { if constexpr (std::is_member_
我是一名优秀的程序员,十分优秀!