C++ 通过专门化排除类成员
我有一个基类模板,在这个模板上我制作了另一个类,它是我的基类的专门版本。我知道如何从特定的专门化案例中排除一些方法,但是否有可能为类的成员这样做?我希望实现的示例代码:C++ 通过专门化排除类成员,c++,c++11,templates,clang++,C++,C++11,Templates,Clang++,我有一个基类模板,在这个模板上我制作了另一个类,它是我的基类的专门版本。我知道如何从特定的专门化案例中排除一些方法,但是否有可能为类的成员这样做?我希望实现的示例代码: template<typename T> class Base { This variable exists only when T==integer VARIABLE; } template <Typename T> WithVariable = using Base<int>; t
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>
模板
阶级基础{
此变量仅在T==整数变量时存在;
}
模板
WithVariable=使用基数;
模板
不带=使用底座
我认为我应该以某种方式使用std::enable,但使用它可以在我不需要该变量时生成类型为“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>'
}
模板
阶级基础{
公众:
T;
};
模板
阶级基础{
};
int main(){
基辅;
foo.t=42;//错误:“Base”中没有名为“t”的成员
}
你能在没有多余成员的情况下专门化这个类吗
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>'
}
模板
阶级基础{
公众:
T;
};
模板
阶级基础{
};
int main(){
基辅;
foo.t=42;//错误:“Base”中没有名为“t”的成员
}
一种可能的方法是有条件地继承。看一看:
struct BaseWithVariable {
int n {42};
};
struct BaseNoVariable {};
template <typename T>
struct Base : std::conditional<std::is_same<T, int>::value, BaseWithVariable, BaseNoVariable>::type {};
struct BaseWithVariable{
int n{42};
};
结构BaseNoVariable{};
模板
结构基:std::conditional::type{};
使用方法:
Base<int> b {};
Base<double> d {};
std::cout << b.n << std::endl;
std::cout << d.n << std::endl; // error
Base b{};
碱基d{};
一种可能的方法是有条件地继承。看一看:
struct BaseWithVariable {
int n {42};
};
struct BaseNoVariable {};
template <typename T>
struct Base : std::conditional<std::is_same<T, int>::value, BaseWithVariable, BaseNoVariable>::type {};
struct BaseWithVariable{
int n{42};
};
结构BaseNoVariable{};
模板
结构基:std::conditional::type{};
使用方法:
Base<int> b {};
Base<double> d {};
std::cout << b.n << std::endl;
std::cout << d.n << std::endl; // error
Base b{};
碱基d{};
std::cout您可以为使用SFINAE的base使用base
#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’
}
#包括
模板
结构基址的基址;
模板
结构基
{int-var;};
模板
结构base\u of_base::type>
{ };
模板
类基:公共基
{ };
int main()
{
碱基bi;
基带;
基本高炉;
基本bd;
bi.var=1;//确定
bl.var=1;//确定
//bf.var=1;//错误:“类基”没有名为“var”的成员
//bd.var=1;//错误:“class base”没有名为“var”的成员
}
您可以为使用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’
}
#包括
模板
结构基址的基址;
模板
结构基
{int-var;};
模板
结构base\u of_base::type>
{ };
模板
类基:公共基
{ };
int main()
{
碱基bi;
基带;
基本高炉;
基本bd;
bi.var=1;//确定
bl.var=1;//确定
//bf.var=1;//错误:“类基”没有名为“var”的成员
//bd.var=1;//错误:“class base”没有名为“var”的成员
}
如何删除该类专业的功能
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;
模板
阶级基础{
公众:
无效无效();
};
模板
void Base::notusable(){
std::cout如何删除该类专业中的函数
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;
模板
阶级基础{
公众:
无效无效();
};
模板
void Base::notusable(){
std::难道你不需要std::enable_if
只需要专门化Base
.PS的模板化父类。你不能创建void
类型的变量…请更具体一些。我想作为模板参数之一传递bool值。bool值将指示例如动物是否有躯干,如果是,我想在类animal\u with\u trunk中有\u trunk的成员len\u。带有\u trunk的animal\u必须是基类animal的专门化版本。我不能使用继承。你不需要std::enable\u if
只需对base
的模板化父类进行专门化。你不能创建void
类型的变量。请更具体一点。我会的我想将bool value作为模板参数之一传递。bool value将指示例如animal是否有trunk,如果是,我希望在类animal_with_trunk中有_trunk的成员len_。带_trunk的animal_必须是基类animal的专用版本。我不能使用继承。但是方法存在问题。如果我想排除如果很多成员中只有一个成员,那么我就必须复制代码。我说得对吗?你说得对,这似乎对方法不起作用,而且很可能我不知道我在说什么:但是方法than有一个问题。如果我想从许多成员中只排除一个成员,那么我就必须复制代码。我说得对吗?你说得对t、 这似乎不适用于方法,很可能我不知道我在说什么: