首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >模板Id生成器定义良好的行为?

模板Id生成器定义良好的行为?
EN

Stack Overflow用户
提问于 2017-06-17 12:12:06
回答 2查看 208关注 0票数 5

我希望避免将Id分配给需要Id的所有类,因此我编写了一个小的模板id生成器。

BaseIdGenerator::makeUniqueId只是返回一个新的Id,每次调用它时:

代码语言:javascript
复制
class BaseIdGenerator {
protected:
    static inline Id makeUniqueId() {
        static Id nextId = 0;
        return nextId++;
    }
};

要将Id分配给单个类,只需将类作为模板参数传递给IdGenerator

代码语言:javascript
复制
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之后也是如此)。

在实际操作中,如下所示:

代码语言:javascript
复制
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
}

这如预期的那样起作用。

  • 在C++中,这是定义良好的行为吗?
  • getId()的许多用途会破坏这一功能吗?(多个源文件等)
  • 这种行为是否是标准化的,因此在每台机器上输出都是相同的,并且在网络应用程序中它将按预期工作?
EN

Stack Overflow用户

发布于 2017-06-17 12:21:57

  • 在C++中,这是定义良好的行为吗?

是的,它定义得很清楚。

  • getId()的许多用途会破坏这一功能吗?(多个源文件等)

不,一般不是。但是多线程访问可能会导致争用条件。

  • 这种行为是否是标准化的,因此在每台机器上输出都是相同的,并且在网络应用程序中它将按预期工作?

是的行为是标准化的。

我看不出对网络应用的干扰,除了恩典。当然,生成的ID将与生成它们的主机处于相同的位置。为了避免这种情况,请使用htonl()函数(假设Id是一个长整数类型)。

票数 2
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44604507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档