2013-03-08 76 views
1

說裏面定義我有一堆的常量的定義命名空間內:「迭代」過常量命名空間

namespace FooConstants{ 
    const string foo1 = "foo1"; 
    const string foo2 = "foo2"; 
    //... 
    const string fooN = "fooN"; 
} 

是否有可能使用頻加速至「迭代」對這些常量的名字呢?就像一個宏擴展生成foo1,foo2fooN,並讓我對每個做一些事情。我相信這可以使用一些Boost庫來完成,但是我找不到它。

順便說一下,這種技術有沒有一個合適的名稱?

編輯:我被要求澄清這是否意味着要在編譯或運行時解決。答案是編譯時間:我想生成對所有常量進行操作的代碼。

+0

你知道'N'嗎? – Flexo 2013-03-08 21:06:30

+0

假設它是硬編碼的,但我想解決一般情況(任何N值) – 2013-03-08 21:10:59

回答

2

我改變你的榜樣,開始不斷的編號爲0,以簡化逗號一代,但你絕對可以做到這一點,事情在編譯時發生的事情:

#include <boost/preprocessor/cat.hpp> 
#include <boost/preprocessor/iteration/local.hpp> 
#include <boost/preprocessor/punctuation/comma_if.hpp> 
#include <utility> 
#include <string> 
#include <map> 

namespace FooConstants{ 
    const std::string foo0 = "foo0"; 
    const std::string foo1 = "foo1"; 
    const std::string foo2 = "foo2"; 
    const std::string foo3 = "fooN"; 
#define N 3 
} 

namespace metadata { 

const std::map<int, std::string> constants = { 

#define BOOST_PP_LOCAL_MACRO(n) \ 
    BOOST_PP_COMMA_IF(n) \ 
    std::make_pair(n, BOOST_PP_CAT(FooConstants::foo,n)) 

#define BOOST_PP_LOCAL_LIMITS (0, N) 

#include BOOST_PP_LOCAL_ITERATE() 
}; 
} 

int main() {} 

這裏預處理器生成initalizer_list從而可以initalise a const std::map。如果你想要的話,你可以用constexpr和模板做更多的瘋狂的const事情。

僅僅因爲這可能並不意味着我會建議在真正的代碼基礎上做。

+0

看起來不錯。但是,爲什麼你不鼓勵做這樣的事情呢? (因爲它使代碼看起來有點難看) – 2013-03-11 14:18:30

+0

@dario_ramos這是「奇怪的代碼」,這意味着維護成本總是會更高。再加上我不相信這會贏得你的勝利,只需將你的常量粘貼到地圖中就可以開始了,但我不認爲這是我試圖在憤怒中使用的東西。 – Flexo 2013-03-11 21:00:40

0

這將需要C++沒有的元數據。你可以拿出一些海關宏,並使用foomax和foomin這樣的會議,但沒有我知道的圖書館。

+1

爲什麼需要元數據?這可以在編譯時解決 – 2013-03-08 21:06:20

+1

@dario你的問題並沒有真正說明「在每個方面做些什麼」是在編譯時還是在運行時發生。也許你應該澄清。 – us2012 2013-03-08 21:07:31

+0

這使用宏和約定我把這個問題的意思是在運行時這是不可能的。 – rerun 2013-03-08 22:02:08