2017-07-17 3 views
1

私はこの基本的なテストコードを試してみましたコンパイルリストデータ構造の作成について前に質問をしていたし、Boost.hanaBoost hanaを使って再帰的にconstexprリストを作成するには?

を使用するように助言された。

#include <boost/hana/tuple.hpp> 
#include <boost/hana/for_each.hpp> 
#include <boost/hana/concat.hpp> 
#include <iostream> 

namespace hana = boost::hana; 

template<typename A, typename R> 
constexpr R parse(A count) 
{ 
    if(count == 0) 
    { 
    return hana::make_tuple(0); 
    } 
    else 
    { 
    return parse(count - 1); 
    } 
} 


int main() 
{ 
    constexpr auto l = parse(10); 

    hana::for_each 
    (
    l, 
    [](auto const& element) 
    { 
     std::cout << element << std::endl; 
    } 
); 

} 

しかし、テンプレート型推論ではありません再帰関数を呼び出すたびに異なる型が返されるためです。 これには方法がありますか?

答えて

2

hanaでメタプログラミングを行うときに理解しなければならない主なことは、値がないことです。数字は操作しません。型を操作しています。これらの型は、それらに関連付けられた値を持つことがありますが、それはまだ型です。その言葉はIntegralConstantです。

template <class C> 
constexpr auto parse(C count) 
{ 
    if constexpr(count == 0_c) { 
     return hana::tuple(count); 
    } else { 
     return hana::flatten(hana::make_tuple(
      hana::tuple(count), 
      parse(count - 1_c))); 
    } 
} 

constexpr auto l = parse(10_c); 

10_c10あるIntegralConstantのインスタンスである:あなたが欲しい

のようなものがあります。これを基本ケースの0_cと比較することができます。値の平等のように見えますが、これはHanaの使用について本当にうれしいことですが、値の平等ではありません。純粋に型に基づいています。

parse(10_c)の結果は、<10,9,8,7,6,5,4,3,2,1,0>のコンパイル時タプルに相当します。


(注)このこと:Rが非推定されるコンテキストであるため、呼び出しサイトで指定する必要がありますので、

template<typename A, typename R> 
constexpr R parse(A count); 

は、特に、使用可能な関数テンプレートではありません。 parse()に関係なく、parse(10)が不正な形になっています。

関連する問題