发出某些模板参数的编译错误

时间:2013-10-19 13:41:32

标签: c++ templates compiler-errors

考虑以下功能:

template<int N> f()
{
    if(N==5)
    {
        std::cerr << "N=5 is not supported!\n";
        abort();
    }
    do_real_work(N);
}

如何将运行时错误消息转换为编译时错误?如果我使用C ++ 11,我想我可以使用static_assert,但是C ++ 03呢?

3 个答案:

答案 0 :(得分:2)

您可以使用BOOST.StaticAssert

#include <boost/static_assert.hpp>

BOOST_STATIC_ASSERT_MSG(N == 5, "N=5 is not supported!\n")

答案 1 :(得分:1)

另一种方法是将函数包装在类模板中,对不受支持的模板参数值进行部分特化:

#include <iostream>

template <int N>
struct wrapper {
    static int f() {
        return N;
    }
};

template <>
struct wrapper<5> {
};

int main() {
    std::cout << wrapper<4>::f() << '\n';
    return 0;
}

答案 2 :(得分:0)

为了完整起见,这里是如何在纯C ++ 03中完成它(基本上没有消息),类似于它在boost中的工作方式:

template <bool x> struct STATIC_ASSERTION_FAILURE;

template <> struct STATIC_ASSERTION_FAILURE<true> { enum { value = 1 }; };

template<int n> void f()
{
    sizeof(STATIC_ASSERTION_FAILURE<n==5>);
}