通过专业化将班级成员排除在外
Exclude class member by specialization
我有基类模板,我正在做其他类,这是我的基类的专业版本。我知道如何将某些方法排除在特定的专业案例之外,但是对于班级的成员有可能做到这一点吗?示例代码,我想实现的目标:
template<typename T>
class Base {
This variable exists only when T==integer VARIABLE;
}
template <Typename T>
WithVariable = using Base<int>;
template <Typename T>
Without = using Base<double>
我认为我应该以某种方式使用std ::启用,但是当我不想要该变量时,可以使用它来制作" void"类型的变量。那仍然不是我要实现的情况。
您可以在没有不必要的成员的情况下专业化课吗?
template <typename T>
class Base {
public:
T t;
};
template <>
class Base<int> {
};
int main() {
Base<int> foo;
foo.t = 42; // Error: no member named 't' in 'Base<int>'
}
这样做的一种可能的方法是有条件继承。看看:
struct BaseWithVariable {
int n {42};
};
struct BaseNoVariable {};
template <typename T>
struct Base : std::conditional<std::is_same<T, int>::value, BaseWithVariable, BaseNoVariable>::type {};
和用法:
Base<int> b {};
Base<double> d {};
std::cout << b.n << std::endl;
std::cout << d.n << std::endl; // error
您还可以为您的类型编写明确的专业化,但是如果您有一组类型(例如来自特定基础的整数或类型),该类型的成员应该与一般类型不同,则此解决方案可能会有所帮助。
您可以使用sfinae
的基础使用基础#include <type_traits>
template <typename, typename = void>
struct base_of_base;
template <typename T>
struct base_of_base<T, typename std::enable_if<std::is_integral<T>::value>::type>
{ int var; };
template <typename T>
struct base_of_base<T, typename std::enable_if<!std::is_integral<T>::value>::type>
{ };
template <typename T>
class base : public base_of_base<T>
{ };
int main()
{
base<int> bi;
base<long> bl;
base<float> bf;
base<double> bd;
bi.var = 1; // OK
bl.var = 1; // OK
// bf.var = 1; // error: ‘class base<float>’ has no member named ‘var’
// bd.var = 1; // error: ‘class base<double>’ has no member named ‘var’
}
delete
从类的专业化中启用函数?
template <typename T>
class Base {
public:
void notUseful();
};
template<typename T>
void Base<T>::notUseful(){
std::cout << "not useful" << std::endl;
return;
}
template <>
void Base<int>::notUseful() = delete;
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 助记符和指向成员语法的指针
- 用于访问容器<T>数据成员的正确 API
- 内置函数可查看CPP中的成员变量
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 嵌套在类中时无法设置成员数据
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 将函数类成员映射到类本身内部
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 如何从doxygen输出中排除类的无证件成员函数/变量
- 通过专业化将班级成员排除在外
- 如何使用"is_member_function_pointer"在算法中包含/排除成员函数调用
- 是否可以从派生类中排除基类成员?
- 为什么成员函数的重载解析排除全局函数
- 是否可以通过模板参数上的条件排除模板成员变量