根据模板启用类的成员
enable class's member depending on template
我已经知道您可以使用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
有什么方法可以实现我想要的吗?
将数据
成员保存在单独的类中,然后可以根据需要进行专用化。
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
,因此它不会节省太多键入。
AFAIK,这在类模板中通过简单的 SFINAE 是不可能的。当然,你可以让成员的类型依赖于编译时条件,即通过std::conditional
,但不能完全消除成员。
当然,您可以做的是使用另一个类模板,例如
template<bool Condition, typename T> struct Has { T value; };
template<typename T> struct Has<false,T> {};
并声明此类型的成员(或基)并通过Has<>::value
访问对象:
template<typename T, bool Condition>
class foo
{
Has<Condition, T> x; // use x.value (only if Condition==true)
};
相关文章:
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 如何启用友元类的友元功能直接在C++中访问其私有成员
- 如果类仅通过要求启用单个成员函数,仍然可以模棱两可地超载
- 为 具有"end"成员变量的类型启用基于范围的
- 如何使用布尔模板参数启用成员函数?
- 一次启用 MANY 类的成员字段,具体取决于模板<T>
- 如果向量是特定的长度,则使用C++11 std::enable_if来启用成员函数
- 启用 if/else 类成员模板实例化
- 启用非模板成员函数,如果FF将打字
- 如果类具有特定的成员函数,则启用模板函数
- 根据模板启用类的成员
- 即使启用了 C++11,静态成员初始化也不适用于 GCC
- C++模板:有条件启用的成员函数
- 只有模板参数有成员功能时,才启用成员功能
- 在类template的成员模板函数上启用le_if
- 使用自身初始化成员变量时启用编译器警告
- 警告:非静态数据成员初始化器只能使用-std=c++11或-std=gnu++11[默认启用]
- 在不更改成员范围的情况下有条件地启用静态成员
- 如何 SFINAE 启用返回“auto”的成员函数
- 'for each'不是 std 的成员。 已启用 C++11 支持