Visual C:模板中的自定义错误消息 Class
Visual C: Custom Error Message in Template Class
下面的代码失败了(正如预期的那样)。困扰我的是错误信息。它没有明确说明问题是什么。我会期待像 “cannot convert from const char* to int”
这样的东西。相反,它表示 "cannot convert from 'initializer list' to 'B<int>'"
,当涉及其他复杂类型时,它变得不太清楚。
如何添加自定义错误消息?实际的class要复杂得多。
#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>'
}
如果您只想拥有一个 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 };
}
下面的代码失败了(正如预期的那样)。困扰我的是错误信息。它没有明确说明问题是什么。我会期待像 “cannot convert from const char* to int”
这样的东西。相反,它表示 "cannot convert from 'initializer list' to 'B<int>'"
,当涉及其他复杂类型时,它变得不太清楚。
如何添加自定义错误消息?实际的class要复杂得多。
#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>'
}
如果您只想拥有一个 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 };
}