【发布时间】:2012-06-13 09:38:03
【问题描述】:
我知道我可以使用模板来假设模板使用的某些类具有某些成员变量;但是,我想知道是否有一种方法可以显式声明模板类必须具有某个成员变量或函数?
我说的是这样的例子:
template <typename T>
class Assume
{
int value;
Assume(T* object) : value(T->AssumedMember) {};
};
class A
{
int AssumedMember;
A(int val) : AssumedMember(val) {};
};
int main()
{
A* a = new A(5);
Assume<A> assumer(a);
return 0;
}
我知道,至少对于 MSVC++ 中使用的编译器,类似于此示例的内容应该可以毫无问题地编译;
我只是想知道是否有一种方法可以声明,对于模板或类的使用,来自类型名 T 的 T 具有成员变量 AssumedMember。到目前为止,真正理解 Assume 仅在与具有正确必需成员(变量、函数或运算符)的类一起使用时才有效的唯一方法,要么必须编译并查看给定的编译器错误,要么自己通读整个模板,以确定是否使用了尚未定义的任何额外内容。
(另外,在不相关的说明中,有没有人知道将整个声明块声明为模板的方法?好像使用类似:
template <typename T> { /*class... member definitions, etc..*/ }
声明整个定义块以使用相同的模板?)
【问题讨论】:
-
在 C++11 中,您可以在 C++ pretty printer 中使用成员存在特征检查,例如
has_begin_end。
标签: c++ class templates declaration member