2017-08-13 43 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