C ++中是否可以根据模板参数包含/排除成员变量?
以下是一个例子:
template< class T >
class RealNumber
{
T real;
};
template< class T >
class ComplexNumber
{
T real;
T imag;
};
由于它们有许多常见属性,只有一个类来表示数字(带有额外的模板参数)可能会阻止某些代码重复。
我想做的是像
template< class T , class U >
Number
{
T real;
// If U is not void
U imag;
}
因此,如果第二个参数为void,则不会有名为imag,yielding:
的成员sizeof( Number< T , void > ) == sizeof( T )
我尝试了enable_if但无法获得任何结果。
如果无法做到这一点,有没有可以实现这一目标的黑客攻击?
答案 0 :(得分:1)
typedef NullType struct {} NullType;
template< class T , class U = NullType>
class Number
{
T real;
U image;
}
答案 1 :(得分:1)
检查继承技巧是否可行:
template<class T, class = void >
class RealNumber
{
protected: T real;
};
template<class T, class U>
class ComplexNumber : public RealNumber<T>
{
U imag;
};
答案 2 :(得分:1)
此答案不完整,仅显示如何使用enable_if
进行类模板的专业化。
template<class T,class U,class Enable = void>
class Number
{
T real;
T imag;
};
template<class T,class U>
class Number<T,U,typename std::enable_if<std::is_void<U>::value>::type>
{
T real;
};
详细实施取决于问题的确切性质。 如,
is_a
关系),您可以考虑从一个实现继承到另一个实现。U
。另外,实数Number<int,void>
或Number<int>
的首选语法应该是什么。等答案 3 :(得分:0)
很难说你在哪里开车,但这是一个粗糙的骨架:
template <typename T> class Number
{
template <typename S> class Adder
{
typedef S type;
static type add(type a, type b) { return a + b; }
};
template <typename U, typename W> class Adder<std::pair<U,W>>
{
typedef typename std::pair<U,W> type;
static type add(type a, type b) { return type(a.first + b.first, a.second + b.second); }
};
T val;
public:
T operator+(const T rhs) { return Adder<T>::add(val, rhs); }
};
请注意,大多数标准库数值函数已经为std::complex
类型重载,因此您可能需要考虑一下您是否真的需要自己编写。
用法:Number<int>
,Number<double>
,Number<std::pair<double, double>>
。