2017-08-13 68 views
3

我想用升壓花生成這個最終代碼:Constexpr環路與無constexpr內容

template < typename ... Ts > 
void foo(Ts ... data) { 

    constexpr auto tuple = hana::make_tuple(data...); 

    //Code that I need to be generate 
    container_c[tuple[0_c]].foo2(); 
    container_c[tuple[1_c]].foo2(); 
    container_c[tuple[2_c]].foo2(); 
} 

container_c是地圖生成在編譯的時候,我不認爲它真正的問題在這裏雖然。 foo2的不constexpr

我在想使用hana::size(tuple).times,但我需要一個增量,可能使用hana::make_range(hana::size_c<0>, hana::size(tuple)),我不知道該怎麼做。

我希望能找到一個功能,這將允許我花裏面的元組的每個成員上執行的功能。類似於hana::transform,但用於void lambda。

我沒有想到如何用Hana找到一些難點,我是否應該像以前一樣使用專業化?

順便說一句,我用gcc 7.1的權利,但你可以對我有沒有編譯器限制假設工作。

+1

'花:: for_each' –

+0

@JasonRice我怎麼沒能找到它在hana文檔中...感謝您的評論!但問這個問題還是個好主意,因爲我最終得到了一個更好的解決方案(我認爲)。 –

回答

4

遍歷您data,你可以做

template < typename ... Ts > 
void foo(Ts ... data) { 
    int dummy[] = {0, (container_c[data].foo2(), void(), 0)...}; 
    static_cast<void>(dummy); // Avoid warning for unused variable. 
} 

還是在C++ 17

template < typename ... Ts > 
void foo(Ts ... data) { 
    (static_cast<void>(container_c[data].foo2()), ...); 
} 
+3

注意,[C++ 17個表達式](http://en.cppreference.com/w/cpp/language/fold)使這個少了很多難看,如果OP的編譯器支持它們。 – hvd

+0

好像要初始化數組遍歷?但是我根本沒有得到這個語法。循環將在運行時完成,然後不會?順便說一句,我沒有任何編譯器的限制,我會編輯我的問題。 –

+0

@hvd:加入C++ 17版本。 – Jarod42