如何在函数使用上使static_assert失败

时间:2018-03-29 13:45:05

标签: c++ visual-studio-2012

当我尝试打印一个类的实例时,我希望编译器抱怨, 让我们说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中实现这一目标?

2 个答案:

答案 0 :(得分:1)

VS2012对C ++ 11的支持不完整。支持函数模板的默认模板参数,即C ++ 11功能{。{3}}。

也许你可以试试这个,但它也使用了一些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

答案 1 :(得分:0)

  

&#34;当我尝试打印一个实例时,我希望编译器抱怨   上课,让我们说T2&#34;

#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
}

我不理解。这不回答你的问题吗?