2013-10-19 35 views
0

考慮以下功能:一些模板的Emit編譯錯誤參數

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呢?

+0

看看Boost.StaticAssert。 – Aleph

回答

2

您可以使用BOOST.StaticAssert

#include <boost/static_assert.hpp> 

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

只是爲了完整性,這裏是如何能夠做到(基本上,沒有消息)在純C++ 03類似,它是如何工作的提升:

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>); 
} 
+0

你不需要'? true:false'。 – 0x499602D2

+0

@ 0x499602D2對,從提升中一味地複製 – Ruslan

+0

你不需要'f'中的return語句嗎? – 0x499602D2

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