我已经知道您可以使用std::enable_if
例如:
template<size_t D, size_t E>
class Field
{
...
size_t offset(const std::array<float,D>& p) const
{
...
}
template<typename TT = size_t>
typename std::enable_if<D!=E, TT>::type
offset(const std::array<float,E>& p) const
{
return offset(_projection(p));
}
...
};
这有助于无法调用在特定情况下无效的函数以及删除重载错误......对我而言,这非常好!
我想进一步让我的班级成员只在需要时出席。这样,如果我试图使用一个本来没有启动的反对意见,我会收到错误
我试着做
template<size_t D, size_t E>
class Field
{
...
template<typename TT = projectionFunc>
typename std::enable_if<D!=E, TT>::type _projection;
}
但是编译器告诉我:
erreur: data member ‘_projection’ cannot be a member template
有没有办法达到我想要的目的?
答案 0 :(得分:7)
将数据成员保存在一个单独的类中,然后您可以根据需要进行专门化。
template<size_t D, size_t E>
class Field {
template<size_t, size_t> struct Field_Members {
int _projection;
};
template<size_t V> struct Field_Members<V, V> { };
Field_Members<D, E> m;
};
然后使用m._projection
等。
Field_Members
不必是嵌套的类模板;如果需要,你可以把它移到外面。也可以让Field
继承它,但是它必须是一个依赖基础,你必须写this->_projection
,所以它不会节省太多的输入。
答案 1 :(得分:5)
AFAIK,在类模板中使用简单的SFINAE是不可能的。当然,您可以使成员的类型依赖于编译时条件,即通过std::conditional
,但不能完全消除该成员。
当然,您可以使用其他类模板,例如
template<bool Condition, typename T> struct Has { T value; };
template<typename T> struct Has<false,T> {};
并声明此类型的成员(或基础)并通过Has<>::value
访问该对象:
typename<Condition>
class foo
{
Has<Condition, double> x; // use x.value (only if Condition==true)
};