我有基类模板,我正在创建另一个类,这是我的基类的专用版本。我知道如何从特定的专业化案例中排除某些方法,但有没有可能为班级成员制作这些方法?示例代码,我想要实现的目标:
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 :: enable,但是当我不想要那个变量时,使用它可以制作类型为#34; void&#34;的VARIABLE。这仍然不是我想要实现的情况。
答案 0 :(得分:2)
你可以在没有不想要的成员的情况下专攻课程吗?
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>'
}
答案 1 :(得分:2)
一种可行的方法是有条件地继承。看看:
print
和用法:
print
您也可以为您的类型编写显式特化,但如果您有一组类型(如整数或从特定基础派生的类型),其成员应该与一般类型不同,则此解决方案可能会有所帮助。
答案 2 :(得分:0)
您可以使用基础用于使用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’
}
答案 3 :(得分:0)
{{1}来自班级专业的功能怎么样?
delete