2016-12-04 7 views
1

hana::keysdocumentationには、関数呼び出し構文でそれを使用できます。 hana::keys(s)sは、概念hana::Structを満たすクラスのインスタンスであり、一連のキーオブジェクトを返します。構造のインスタンスなしで `hana :: keys`を使用できますか?

関連する関数hana::accessorsは、構造体のインスタンスから対応するメンバーを取得するために使用できる一連のアクセサ関数を返します。

hana::accessorscan be used in two ways

hana::accessors(s) 
hana::accessors<S>() 

S = decltype(s)同じものを返すの両方の法的、constexpr機能です - Sを構造に対応するシーケンス。

hana::keysでこの構文を試してみると、エラーが発生します。ここでhanaドキュメントの例から適応MCVE、です:


#include <boost/hana.hpp> 
#include <boost/hana/define_struct.hpp> 
#include <boost/hana/keys.hpp> 
#include <iostream> 
#include <string> 

namespace hana = boost::hana; 

struct Person { 
    BOOST_HANA_DEFINE_STRUCT(Person, 
     (std::string, name), 
     (unsigned short, age) 
    ); 
}; 


// Debug print a single structure 

template <typename T> 
void debug_print_field(const char * name, const T & value) { 
    std::cout << "\t" << name << ": " << value << std::endl; 
} 


template <typename S> 
void debug_print(const S & s) { 
    std::cout << "{\n"; 

    hana::for_each(hana::keys<S>(), [&s] (auto key) { 
    debug_print_field(hana::to<char const *>(key), hana::at_key(s, key)); 
    }); 

    std::cout << "}" << std::endl; 
} 

// Debug print compare two structures 

int main() { 
    Person john{"John", 30}, kevin{"Kevin", 20}; 

    debug_print(john); 
    std::cout << std::endl; 
    debug_print(kevin); 
    std::cout << std::endl; 
} 

$ g++-6 -std=c++14 -I/home/chris/boost/boost_1_61_0/ main.cpp 
main.cpp: In function ‘void debug_print(const S&)’: 
main.cpp:28:30: error: expected primary-expression before ‘>’ token 
    hana::for_each(hana::keys<S>(), [&s] (auto key) { 
          ^
main.cpp:28:32: error: expected primary-expression before ‘)’ token 
    hana::for_each(hana::keys<S>(), [&s] (auto key) { 
           ^

私はhana::keys(s)を使用する場合には、正常に動作します。

私の実際のアプリケーションでは、構造体のインスタンスがありません。これはテンプレートパラメータに過ぎません。ハックとして

、私はこの作られた:私は、これはドキュメンタリーで説明hanaの実装の詳細の私の限られた理解に基づいて動作することをを信じる

// Work around for `hana::keys` 

template <typename S> 
constexpr decltype(auto) get_hana_keys() { 
    return decltype(hana::keys(std::declval<S>())){}; 
} 

を。 - hana::keysは、コンパイル時の文字列のシーケンスを返すと仮定され、すべての情報が型に含まれているので、型を取得するだけで、それを構成するデフォルトは同等でなければなりません。

MCVEでget_hana_keys<S>()を使用すると、コンパイルされて正常に動作します。

しかし、それが本当に正しいかどうか、あるいは私が仮定していることが、ドキュメントで想定していることを超えているかどうかはわかりません。

私はブーストバージョン1.61gcc 6.2.0を使用しています。私が知りたいのですがどのような

  • hana::keys<S>()が動作しないか、これは単に見落としていることは良い理由がある

    hanaは非常に細心の注意を払ってデザインされているようです。

  • 作成したハックに問題がありますか、改善する方法はありますか?

答えて

2

良い質問!

hana::keys<S>()が機能しないか、これは単に監視の理由ですか?

hana::keys<S>()が機能しないのは、一般的な場合に実装する方法がないからです。実際には、keyshana::mapのために最初に設計されました。というステートフルなので、意味のあるものを返すオブジェクトが本当に必要です。オブジェクトがhana::Structのキーを取得する必要がないという事実は、偶然の一致です。

作成したハックに問題がありますか、改善する方法はありますか?

技術的には、hana::stringはデフォルト-構成可能であるとして文書化されていないので、これらのデフォルト・構築hana::tupleは動作が保証されていません。しかし、これは私が1eebdbに修正した監督なので、よかったです。言われていること

、おそらくより多くの慣用的なソリューションは、次のようになります。実際には

template <typename S> 
constexpr auto get_hana_keys() { 
    return hana::transform(hana::accessors<S>(), hana::first); 
} 

、これは我々がhana::Struct秒間hana::keysを定義する方法です。

最後に、hana::Structに関連するすべての機能が言語レベルの反映により優れていることに注意してください。ハナが提供する奇妙な反射のサポートは間違いありません。言語サポートがなければ、その分野で何か良いことをするのは本当に難しいです。

関連する問題