相关疑难解决方法(0)

在static_assert输出中集成类型名称?

我喜欢提供有用的错误/消息,我也想为我static_assert的.问题是,它们依赖于模板参数.通常情况下,由于引发的错误,这些参数会在途中或其他参数上显示,但它们要么模糊不清,要么不分组,因此它们有意义.例:

template<class T>
struct fake_dependency{
  static bool const value = false;
};

template<class T, class Tag>
struct Foo{
  Foo(){}

  template<class OtherTag>
  Foo(Foo<T, OtherTag> const&){
    static_assert(fake_dependency<T>::value, "Cannot create Foo<T,Tag> from Foo<T,OtherTag>.");
  }
};

int main(){
    Foo<int, struct TagA> fA;
    Foo<int, struct TagB> fB(fA);
}
Run Code Online (Sandbox Code Playgroud)

MSVC上的输出:

src\main.cpp(74): error C2338: Cannot create Foo<T,Tag> from Foo<T,OtherTag>.
          src\main.cpp(84) : see reference to function template instantiation 'Foo<T,Tag>::Foo<main::TagA>(const Foo<T,main::TagA> &)' being compiled
          with
          [
              T=int,
              Tag=main::TagB
          ]
Run Code Online (Sandbox Code Playgroud)

函数模板本身提到了一个标记,下面是类模板.不太好.让我们看看海湾合作委员会的成果:

prog.cpp: In constructor 'Foo<T, Tag>::Foo(const …
Run Code Online (Sandbox Code Playgroud)

c++ templates static-assert custom-errors c++11

56
推荐指数
2
解决办法
1万
查看次数

有没有办法让C预处理器解析#error语句中的宏?

正如标题所说.我想在#error语句的文本中使用预处理器宏:

#define SOME_MACRO 1

#if SOME_MACRO != 0
    #error "SOME_MACRO was not 0; it was [value of SOME_MACRO]"
#endif
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我希望预处理器解析[value of SOME_MACRO]为实际值SOME_MACRO,在这种情况下为1.这应该在预处理器,编译器或任何进程之前发生#error打印错误输出
有没有办法做到这一点或者这不是可能?

我不想知道是否有ISO C++标准方法可以做到这一点,因为afaik预处理器指令#error没有在任何ISO C++标准中声明.但是,我知道GCC和Visual C++的支持#error.但我的问题不是那些编译器特有的,我只是好奇,如果有任何C/C++编译器/预处理器可以做到这一点.

我试图搜索那个话题,但没有任何运气.

c++ c-preprocessor

11
推荐指数
2
解决办法
3984
查看次数