'std::enable_if' 是函数指针 - 如何
`std::enable_if` is function pointer - how?
如果用户将函数指针作为参数传递,我想使用 SFINAE 启用特定模板。
我用谷歌搜索过,但一无所获 - 我也尝试查看<type_traits>
文档,但找不到任何类似于is_function_ptr<T>
的东西。
我所说的函数指针是指全局函数指针,如TReturn(*)(TArgs...)
。
下面是
一个类型特征,用于确定某物是否是函数指针和几个测试用例。请注意,要测试某些内容是否是函数指针,您需要测试std::is_pointer<P>::value
是否true
以及std::is_function<T>::value
是否true
在删除指针的情况下P
T
的位置。下面的代码就是这样做的:
#include <type_traits>
#include <iostream>
#include <utility>
template <typename Fun>
struct is_fun_ptr
: std::integral_constant<bool, std::is_pointer<Fun>::value
&& std::is_function<
typename std::remove_pointer<Fun>::type
>::value>
{
};
template <typename Fun>
typename std::enable_if<is_fun_ptr<Fun>::value>::type
test(Fun) {
std::cout << "is a function pointern";
}
template <typename Fun>
typename std::enable_if<!is_fun_ptr<Fun>::value>::type
test(Fun) {
std::cout << "is not a function pointern";
}
void f0() {}
void f1(int) {}
void f2(int, double) {}
struct s0 { void operator()() {} };
struct s1 { void operator()(int) {} };
struct s2 { void operator()(int, double) {} };
int main()
{
int v0(0);
int* p0(&v0);
void (*p1)() = &f0;
void (**p2)() = &p1;
std::cout << "v0="; test(v0);
std::cout << "p0="; test(p0);
std::cout << "p1="; test(p1);
std::cout << "p2="; test(p2);
std::cout << "f0="; test(&f0);
std::cout << "f1="; test(&f1);
std::cout << "f2="; test(&f2);
std::cout << "s0="; test(s0());
std::cout << "s1="; test(s1());
std::cout << "s2="; test(s2());
std::cout << "l0="; test([](){});
std::cout << "l1="; test([](int){});
std::cout << "l2="; test([](int, double){});
}
不需要 SFINAE 来接受函数指针或成员函数指针。为了区分函数对象和不可调用的东西,需要SFINAE,可能没有办法解决这个问题。
#include <utility>
#include <iostream>
template <typename Ret, typename... Parm>
void moo (Ret (*fp)(Parm...))
{
std::cout << "funptr" << std::endl;
}
template <typename Ret, typename Owner, typename... Parm>
void moo (Ret (Owner::*fp1)(Parm...))
{
std::cout << "memfunptr" << std::endl;
}
template <typename Funobj, typename... Parm,
typename Ret =
decltype((std::declval<Funobj>())
(std::forward(std::declval<Parm>())...))>
void moo (Funobj functor)
{
std::cout << "funobj" << std::endl;
}
void x1() {}
struct X2 { void x2() {} };
struct X3 { void operator()(){} };
int main()
{
moo(x1);
moo(&X2::x2);
moo(X3());
}
相关文章:
- 指向C++中成员的指针如何在内部工作?
- 指向未由对象地址初始化的对象的指针如何将值分配给类的数据成员
- 可变引用以及指针如何与内存相互作用
- 引用计数智能指针如何避免或处理引用计数器溢出?
- 指向成员函数的指针如何工作
- 指向成员结构的指针如何工作
- 当调用FREAD()函数时,文件指针如何移动
- 指向成员的指针如何知道它绑定了哪个成员
- 统一处理具有协变类型的函数指针(如何使用派生类型调用回调?
- 返回一个指向char数组的指针.如何打印出数组的全部内容
- 基本指针如何能够在派生的类实例中了解基本成员的内存位置
- 对象指针如何知道要删除多少内存
- 无效指针:如何用作通用班指针
- 指向结构的指针如何有效
- 指针如何引用硬盘中的段
- 指针如何变化
- 指向数组指针的双星指针;如何访问数组的指针?C++
- 当退出 new/malloc 函数时,从 new/malloc 返回的指针如何保持在范围内
- 指针如何在函数参数中传递?带有示例程序
- 成员函数指针 - 如何执行此操作