2014-04-12 45 views
1

沒有與宏觀常量的這樣一個很長的列表中的C頭:查找模板類的constexpr功能正確的宏觀恆

#define MODE_1_A 101 
#define MODE_1_AB 21 
#define MODE_1_ABC 9901 
#define MODE_2_A 1031 
#define MODE_2_AB 347 
#define MODE_2_ABC 692 
... 

雖然宏名都遵循一個規律,可惜沒有可靠計算常數的方法。

我想寫一個模板類,它可以返回正確的模式整數作爲constexpr

template<unsigned C, unsigned M> 
struct MyClass 
{ 
    constexpr int mode() { 
     // C = 1 & M == 1 => return MODE_1_A 
     // C = 1 & M == 2 => return MODE_1_AB 
     // and so on 
    } 
    ... // a lot of additional code 
}; 

什麼是寫constexpr功能mode的最佳方式?

+0

使用條件運算符。 –

+0

@ R.MartinhoFernandes:對於很多常量,這可能會變得雜亂...... – Danvil

+1

如果你沒有注意到,這已經是凌亂了。 –

回答

1

您可以專注方法:

template<unsigned C, unsigned M> 
struct MyClass 
{ 
    static constexpr int mode(); 
}; 

template<> constexpr int MyClass<1, 1>::mode() { return 101; } 
template<> constexpr int MyClass<1, 2>::mode() { return 21; } 

而且隨着TAG(N, C)Macro for mapping integer to string for token

#define DEFINE_MODE(N,C) \ 
    template<> constexpr int MyClass<N, C>::mode() { return TAG(N, C); } 

DEFINE_MODE(1, 1) 
DEFINE_MODE(1, 2) 
DEFINE_MODE(2, 1) 
// ... 
+0

啊,我不知道你能做到:) – Danvil

2

使用預處理器!使用Boost.Preprocessor庫:

#include <boost/preprocessor.hpp> 
#define BOOST_PP_LOCAL_MACRO(n) \ 
    template<> struct MyClass<n, 1> { \ 
     constexpr int mode() { return BOOST_PP_CAT(BOOST_PP_CAT(MODE_, n), _A); } }; \ 
    template<> struct MyClass<n, 2> { \ 
     constexpr int mode() { return BOOST_PP_CAT(BOOST_PP_CAT(MODE_, n), _AB); } }; \ 
    template<> struct MyClass<n, 3> { \ 
     constexpr int mode() { return BOOST_PP_CAT(BOOST_PP_CAT(MODE_, n), _ABC); } }; \ 
#define BOOST_PP_LOCAL_LIMITS (1, 10) 
#include BOOST_PP_LOCAL_ITERATE() 
+0

'MyClass'中有很多額外的代碼。用你的方法,這將需要重複... – Danvil

+0

@Danvil很容易,只需將映射到自己的模板,並從'MyClass :: mode()'調用它。 – ecatmur

+0

是的,你可以做到這一點。 – Danvil

-1

你可以堅持使用宏:

#define MODE(a,b) MODE_##a##_##b 

然後使用它是這樣的:

std::cout << MODE(2,ABC) << std::endl; 

你的問題錯過怎麼縫整數M向字符串A,AB,ABC的信息......此外,沒有C和M總是在編譯時知道或可能一些外部函數的變量參數?

+0

'MyClass'是一個模板! – Danvil

+0

@Danvil,'MyClass'看起來像[解決X問題的Y解決方案](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。不要問Y,但詢問X. – galop1n

+1

我不明白這是如何適用的。我的問題在這個問題上已經清楚地陳述了 – Danvil