【发布时间】:2014-01-16 00:55:19
【问题描述】:
我想为任意类型 T 创建一个容器。但是,如果 T 有一个头类型的成员(我也定义),我想添加一些功能。如果 T 没有该标头成员,则可以跳过添加的功能。
例如,添加的功能可能是根据执行操作的时间添加时间戳。这是我想要的伪代码:
struct my_header {
timestamp_t time;
// ... etc ...
}
template <class T>
class my_container {
public:
void some_operation(T val) {
// condition evaluated at compile time
if T has a member of type my_header {
val.header.time = get_current_time();
// ... etc ...
}
// other operations, agnostic to T
}
};
当然,正如我所拥有的,some_operation 还必须找出类 T 中 my_header 实例的名称。可以通过对要使用的附加功能施加以下要求之一来消除此要求(按顺序从最好到最差):
- T 类中
my_header的实例必须具有名称header -
my_header的实例是类T中的第一个成员变量 - 类 T 派生自 my_header,而不是将其包含为成员变量
使用 C++11 就可以了(实际上是预料之中的)。
【问题讨论】:
-
您可以根据名称为
header的东西进行检查,即my_header,但不能在没有班级告诉您的情况下不知道名称。 -
@Ken 你想检查 T 的类型吗?
-
这到底是如何工作的?无论您如何检查变量是否存在,代码都不会编译失败(因为
val.header.time)。我认为解决方案将涉及专业化。 -
@remyabel Tag dispatch 可以成为你的朋友。
-
我从另一个答案中发现了这一点,并对其进行了一些更改。试试看:coliru.stacked-crooked.com/a/fb4dfd66f03561bc。 @Xeo,你可能会觉得很熟悉:p