如何禁用某些模板类型的类成员函数
How to disable a class member function for certain template types
这似乎很简单,但我对std::enable_if
的语法有一些困难
情况其实很简单。
具有模板参数T
的模板类
2 不得针对特定类型的T
实现的功能。
这两个函数都没有参数或返回值T
一个函数接受int
,另一个函数返回int
。
任何简单的例子?
还是有另一个不使用std::enable_if
的选项(C++11(?
这真的很简单。只需记住使用默认为类/结构模板参数的另一个模板参数。
假设您想要一个具有两个成员 void foo<T>::bar1 (int)
和 int foo<T>::bar2 ()
的类foo<T>
,并假设您希望仅在T
与 long
不同时才实现bar1()
和bar2()
。
您可以执行以下操作
#include <type_traits>
template <typename T>
struct foo
{
template <typename U = T>
typename std::enable_if<false == std::is_same<U, long>::value>::type
bar1 (int)
{ }
template <typename U = T>
typename std::enable_if<false == std::is_same<U, long>::value, int>::type
bar2 ()
{ return 0; }
};
int main()
{
foo<int> fi;
foo<long> fl;
fi.bar1(0); // compile
fi.bar2(); // compile
// fl.bar1(0); // compilation error
// fl.bar2(); // compilation error
}
存在危险:有人可以绕过您的控制并显式U
类型,如下所示
foo<long> fl;
fl.bar1<long long>(0);
为避免此问题,您可以按如下方式改进std::enable_if
测试
template <typename U = T>
typename std::enable_if
<sizeof(U) && (false == std::is_same<T, long>::value)>::type
bar1 (int)
{ }
template <typename U = T>
typename std::enable_if
<sizeof(U) && (false == std::is_same<T, long>::value), int>::type
bar2 ()
{ return 0; }
如果可以使用 C++14 编译器,则使用 std::enable_if_t
可以避免几个typename
和几个 如果::type
并举例说明代码,如下所示
template <typename U = T>
std::enable_if_t<sizeof(U) && (false == std::is_same<T, long>::value)>
bar1 (int)
{ }
template <typename U = T>
std::enable_if_t<sizeof(U) && (false == std::is_same<T, long>::value), int>
bar2 ()
{ return 0; }
截至 C++20,requires
关键字使事情变得更加简单:
void bar1 (int) requires (!std::is_same_v<T, long>)
{ }
int bar2 () requires (!std::is_same_v<T, long>)
{ return 0; }
相关文章:
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 将公共但非静态的成员函数与ALGLIB集成
- 使用指向成员的指针将成员函数作为参数传递
- 将重载的成员函数传递给函数模板
- 我不小心调用了一个没有自己类对象的成员函数.但这是怎么回事呢
- 如何在C++中使用非静态成员函数作为回调函数
- C++错误C2600:无法定义编译器生成的特殊成员函数(必须首先在类中声明)
- 关联容器的下界复杂性:成员函数与非成员函数
- 在 C++ 中用派生类型重写成员函数
- 链表的泛型函数remove()与成员函数remove)
- 如何将lambda作为模板类的成员函数参数
- constexpr构造函数需要常量成员函数时出现问题
- 将自由函数绑定为类成员函数
- 区分非成员函数和头文件中的成员函数
- 如何从子成员函数修改父公共成员变量
- 保留对其他类的成员函数的引用
- 在运算符重载定义中使用成员函数(const错误)
- 内联如何影响模块接口中的成员函数
- 将成员函数指针作为参数传递给模板方法