模板和__LINE__的问题

时间:2010-11-08 23:35:19

标签: c++ visual-c++ templates types standards

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

更新
下面的代码来自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,然后使用__COUNTER__进行msvc ...

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

1 个答案:

答案 0 :(得分:3)

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

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

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

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