Visual C:模板类中的自定义错误消息

问题描述 投票:0回答:1

以下代码失败(如预期)。令我困扰的是错误消息。它没有明确说明问题所在。我本来希望像“cannot convert from const char* to int”这样的东西。相反,它说"cannot convert from 'initializer list' to 'B<int>'",当涉及其他复杂类型时,它变得不太清楚。

如何添加自定义错误消息?实际的课程要复杂得多。

#include <vector>

template< typename T >
class B
{
  std::vector<T> v;
public:
  B( std::initializer_list<T> il ) : v{ il } {}
};

int main()
{
  B<int> b{ "a","b","c" }; // fails with cannot convert from 'initializer list' to 'B<int>'
}
c++ visual-c++ static-assert
1个回答
0
投票

[如果只想拥有一个std::initializer_list<T>构造函数,那么您可以做的一件事就是提供一个可变参数模板构造函数,然后在构造函数中包含一个static_assert来提供所需的错误消息。之所以可行,是因为如果您提供了std::initializer_list<T>以外的其他任何内容,则构造函数将更好地匹配并且断言将触发。看起来像

#include <vector>

template< typename T >
class B
{
    std::vector<T> v;
public:
    B( std::initializer_list<T> il ) : v{ il } {}
    template <typename... Args>
    // the sizeof...(Args) < 0 is needed so the assert will only fire if the constructor is called
    B(Args...) { static_assert(sizeof...(Args) < 0, "This class can only be constructed from a std::initializer_list<T>"); }
};

int main()
{
    //B<int> b1{ "a","b","c" }; // uncomment this line to get static_assert to fire
    B<int> b2{ 1,2,3 };
}
© www.soinside.com 2019 - 2024. All rights reserved.