如何在函数使用上失败 static_assert
How to fail static_assert on function use
我希望编译器在我尝试打印一个 class 的实例时抱怨,
假设 T2
。在 VS2013+ 我可以使用:
template <typename T = float>
std::ostream & operator<<(std::ostream & os, const T2 & t2) {
static_assert(std::is_integral<T>::value, "Fail in << for T2");
return os;
}
然而,这在 VS2012 中不起作用 (error C4519: default template arguments are only allowed on a class template
)。有什么想法可以在 VS2012 中实现吗?
VS2012 对 C++11 的支持不完整。支持函数模板的默认模板参数,作为 C++11 的特性 starting with VS2013。
也许你可以试试这个,但它也使用了一些 C++11 特性:
template <typename T>
auto operator<<(std::ostream & os, T const& t2) ->
typename std::enable_if<std::is_same<T, T2>::value, std::ostream&>::type
{
static_assert(false, "Fail in << for T2");
return os;
}
如果这也不起作用,我会优雅地降级为像 VS2012 这样的陈旧废话并完成它。
#if _MSC_VER < 1800
std::ostream& operator<<(std::ostream & os, T2 const& t2); // will fail at link time
#else
. . .
#endif
"I want compiler to complain when I try to print instances of one
class, let's say T2"
#include <iostream>
struct T1 { int a; };
struct T2 { int a; };
template <typename T>
std::ostream & operator<<(std::ostream & os, const T & t2)
{
static_assert(!std::is_same<T2, T>::value, "Fail in << for T2");
return os;
}
int main()
{
T1 t1;
T2 t2;
std::cout << t1; // Works
std::cout << t2; // Static assert fail
}
我不明白。这没有回答您的问题吗?
我希望编译器在我尝试打印一个 class 的实例时抱怨,
假设 T2
。在 VS2013+ 我可以使用:
template <typename T = float>
std::ostream & operator<<(std::ostream & os, const T2 & t2) {
static_assert(std::is_integral<T>::value, "Fail in << for T2");
return os;
}
然而,这在 VS2012 中不起作用 (error C4519: default template arguments are only allowed on a class template
)。有什么想法可以在 VS2012 中实现吗?
VS2012 对 C++11 的支持不完整。支持函数模板的默认模板参数,作为 C++11 的特性 starting with VS2013。
也许你可以试试这个,但它也使用了一些 C++11 特性:
template <typename T>
auto operator<<(std::ostream & os, T const& t2) ->
typename std::enable_if<std::is_same<T, T2>::value, std::ostream&>::type
{
static_assert(false, "Fail in << for T2");
return os;
}
如果这也不起作用,我会优雅地降级为像 VS2012 这样的陈旧废话并完成它。
#if _MSC_VER < 1800
std::ostream& operator<<(std::ostream & os, T2 const& t2); // will fail at link time
#else
. . .
#endif
"I want compiler to complain when I try to print instances of one class, let's say T2"
#include <iostream>
struct T1 { int a; };
struct T2 { int a; };
template <typename T>
std::ostream & operator<<(std::ostream & os, const T & t2)
{
static_assert(!std::is_same<T2, T>::value, "Fail in << for T2");
return os;
}
int main()
{
T1 t1;
T2 t2;
std::cout << t1; // Works
std::cout << t2; // Static assert fail
}
我不明白。这没有回答您的问题吗?