反正有没有避免警告/错误模板实例化回溯?

时间:2015-03-02 17:42:45

标签: c++ c++11 gcc clang

花了一些时间,完全不知道是否可能。因此我想在这里问一下。那么,在gcc / clang上显示警告/错误时,是否有任何聪明的方法强制不打印模板回溯?

示例:

template<int I = 0, typename = void>
struct warn {
    unsigned : I;
};
struct hello_world {};

template<int I>
class a : warn<I, hello_world> {};

template<int I>
class b : a<I>{};

template<int I>
class c : b<I> {};

template<int I>
class d : c<I> {};

int main() {
    d<80>{};
}

给出:

test.cpp:3:5: warning: size of anonymous bit-field (80 bits) exceeds size of its type; value will be truncated to 32 bits
    unsigned : I;
    ^
test.cpp:8:11: note: in instantiation of template class 'warn<80, hello_world>' requested here
class a : warn<I, hello_world> {};
          ^
test.cpp:11:11: note: in instantiation of template class 'a<80>' requested here
class b : a<I>{};
          ^
test.cpp:14:11: note: in instantiation of template class 'b<80>' requested here
class c : b<I> {};
          ^
test.cpp:17:11: note: in instantiation of template class 'c<80>' requested here
class d : c<I> {};
          ^
test.cpp:20:2: note: in instantiation of template class 'd<80>' requested here
        d<80>{};
        ^
1 warning generated.

因此,预期结果将是例如:

test.cpp:3:5: warning: size of anonymous bit-field (80 bits) exceeds size of its type; value will be truncated to 32 bits
    unsigned : I;
    ^
test.cpp:8:11: note: in instantiation of template class 'warn<80, hello_world>' requested here
class a : warn<I, hello_world> {};

有-ftemplate-backtrace-limit = 1 -ferror-limit = 1,但我想知道是否有可能从源代码中做到这一点。

为什么我需要这样的功能?好吧,我通过enable-if使用概念模拟,但不幸的是我在我的概念构造中有模板转换操作符,并且不能返回值和静态断言或启用 - 如果它,因为信息不是可用了。因此,我认为警告+概念可能会做到这一点。让我们说我仍然会有这个概念并用有用的东西打印一行警告,然后像往常一样使用enable-if禁用该功能。

1 个答案:

答案 0 :(得分:2)

您可以使用别名而不是类/结构来接近:

template<int I = 0, typename = void>
struct warn {
    unsigned : I;
};
struct hello_world {};

template<int I>
using a = warn<I, hello_world>;

template<int I>
using b = a<I>;

template<int I>
using c = b<I>;

template<int I>
using d = c<I>;

int main() {
  (void)d<80>{};
}

输出:

test.cpp:3:5: warning: size of anonymous bit-field (80 bits) exceeds size of its type; value will be truncated to 32 bits
    unsigned : I;
    ^
test.cpp:20:9: note: in instantiation of template class 'warn<80, hello_world>' requested here
  (void)d<80>{};
        ^
1 warning generated.