gpt4 book ai didi

c++ - 模板和 __LINE__ 问题

转载 作者:太空狗 更新时间:2023-10-29 21:29:45 28 4
gpt4 key购买 nike

我正在编写一些我想集成到库中的代码。我希望它没有外部依赖性并且符合标准。我想使用模板创建一个唯一的类型以允许编译时类型检查。

更新:
下面的代码来自msdn,这不是我尝试做的。我尝试做的是在用户每次使用宏实例化它时使用一个模板来拥有一个唯一的类型。这样就可以在编译时检查类型是否混合。我正在处理本文中的代码:http://www.artima.com/cppsource/safelabels.html是的,我知道 std::bitset 的存在,谢谢。

正如 Tony 所指出的,__LINE__ 无论如何都不能保证唯一性。

我遇到了以下错误:

http://msdn.microsoft.com/en-us/library/kyf0z2ka%28v=VS.100%29.aspx

C2975 will also occur when you use `__LINE__` as a compile-time constant with /ZI:

// C2975b.cpp
// compile with: /ZI
// processor: x86
template<long line>
void test(void) {}

int main() {
test<__LINE__>(); // C2975
test<__LINE__>(); // OK
}

在没有/ZI 的情况下编译一切都很好,但它是 msvc 中的默认设置,我不希望我的库的所有用户首先遇到编译器错误,直到我告诉他们关闭该开关。

你会如何解决这个问题?

到目前为止,我唯一现实的想法是检查 msvc 是否存在,然后对 msvc 使用 __COUNTER__...

更新:
实际上 __COUNTER__ 不起作用,因为我需要类型在每个声明中都是唯一的,但对于不同的翻译单元,它们必须相同,否则我会遇到未解析的外部引用的链接器问题。

最佳答案

获得唯一实例化的第一个挑战是区分翻译单元。幸运的是,这一点很简单:

namespace { struct unique_type {}; }
template<typename T> int foo() { return 42; }
static int bar = foo<unique_type>();

这可以放在标题中,并将实例化一个不同的 foo<unique_type>()在每个翻译单元中。添加 __LINE__由于 MSVC 错误需要一些工作:

namespace {
struct unique_type{};
const int LINE = __LINE__;
}
template<typename T, int N> int foo() { return 42; }
static int bar = foo<unique_type, LINE>();

关于c++ - 模板和 __LINE__ 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4129141/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com