我希望避免将Id分配给需要Id的所有类,因此我编写了一个小的模板id生成器。
BaseIdGenerator::makeUniqueId只是返回一个新的Id,每次调用它时:
class BaseIdGenerator {
protected:
static inline Id makeUniqueId() {
static Id nextId = 0;
return nextId++;
}
};要将Id分配给单个类,只需将类作为模板参数传递给IdGenerator。
template <typename T>
Id getId();
template <typename T>
class IdGenerator final : public BaseIdGenerator {
static Id id;
template <typename Type>
friend Id getId();
};
template <typename T>
inline Id getId() {
return IdGenerator<T>::id;
}
template <typename T>
Id IdGenerator<T>::id = IdGenerator<T>::makeUniqueId();这将精确地每个类调用makeUniqueId()一次(即使在多线程应用程序中,由于线程安全的本地静态变量,C++11之后也是如此)。
在实际操作中,如下所示:
int main() {
std::cout << getId<int>() << std::endl; // prints 0
std::cout << getId<bool>() << std::endl; // prints 1
std::cout << getId<char>() << std::endl; // prints 2
}这如预期的那样起作用。
getId()的许多用途会破坏这一功能吗?(多个源文件等)发布于 2017-06-17 12:21:57
是的,它定义得很清楚。
getId()的许多用途会破坏这一功能吗?(多个源文件等)不,一般不是。但是多线程访问可能会导致争用条件。
是的行为是标准化的。
我看不出对网络应用的干扰,除了恩典。当然,生成的ID将与生成它们的主机处于相同的位置。为了避免这种情况,请使用htonl()函数(假设Id是一个长整数类型)。
https://stackoverflow.com/questions/44604507
复制相似问题