2015-09-20 17 views
7

Boost Hanaシンプルで美しい方法で、クラスメンバフィールドでイントロスペクションする機能を提供します。Boost Hanaを使ってメソッドをイントロスペクトすることは可能ですか?

// define: 

struct Person { 
    std::string name; 
    int age; 
}; 

// below could be done inline, but I prefer not polluting the 
// declaration of the struct 
BOOST_HANA_ADAPT_STRUCT(not_my_namespace::Person, name, age); 

// then: 

Person john{"John", 30}; 
hana::for_each(john, [](auto pair) { 
    std::cout << hana::to<char const*>(hana::first(pair)) << ": " 
      << hana::second(pair) << std::endl; 
}); 

ただし、ドキュメントが唯一のメンバーフィールドに言及しています。私は方法についてもイントロスペクトしたいと思います。私はメソッドを使って例を素直に拡張しようとしました:

struct Foo { 
    std::string get_name() const { return "louis"; } 
}; 

BOOST_HANA_ADAPT_STRUCT(::Foo, get_name); 

これはコンパイルされます。しかし、私はそれを使用しようとすぐに、上記のようなコードを使用して(for_each ...)、私は多くのコンパイルエラーを取得します。メソッドのイントロスペクションを示す例はないので、サポートされているかどうかは疑問です。

+0

これはサポートされていますが、より良い文書化が可能であることに同意します。 ['Struct'](http://ldionne.com/hana/structboost_1_1hana_1_1Struct.html)コンセプトの_完全な定義_セクションを見ることができます。私は今すぐ完全な答えを書く時間がありませんが、私は次の日にそれをやろうとします(またチュートリアルも更新します)。 –

答えて

9

私の元の回答は虚偽でした。そのために残念。実際に質問に答えるリライトがあります。

カスタムアクセサでStructを簡単に定義できるようにマクロを追加しました。あなたができる方法は次のとおりです。

#include <boost/hana/adapt_adt.hpp> 
#include <boost/hana/at_key.hpp> 
#include <boost/hana/string.hpp> 
#include <cassert> 
#include <string> 
namespace hana = boost::hana; 

struct Person { 
    Person(std::string const& name, int age) : name_(name), age_(age) { } 
    std::string const& get_name() const { return name_; } 
    int get_age() const { return age_; } 
private: 
    std::string name_; 
    int age_; 
}; 

BOOST_HANA_ADAPT_ADT(Person, 
    (name, [](auto const& p) { return p.get_name(); }), 
    (age, [](auto const& p) { return p.get_age(); }) 
); 

int main() { 
    Person bob{"Bob", 30}; 
    assert(hana::at_key(bob, BOOST_HANA_STRING("name")) == "Bob"); 
    assert(hana::at_key(bob, BOOST_HANA_STRING("age")) == 30); 
} 

そのコードはmasterで動作するはずです。あなたのアクセサまたはそれらにマップするために使用されるキーの定義をより詳細に制御する必要がある場合はそれ以外の場合、あなたはまた、手で全体を定義することができます。

namespace boost { namespace hana { 
    template <> 
    struct accessors_impl<Person> { 
     static auto apply() { 
      return hana::make_tuple(
       hana::make_pair(BOOST_HANA_STRING("name"), [](auto&& p) -> std::string const& { 
        return p.get_name(); 
       }), 
       hana::make_pair(BOOST_HANA_STRING("age"), [](auto&& p) { 
        return p.get_age(); 
       }) 
      ); 
     } 
    }; 
}} 

あなたはStruct Sを定義する方法についての詳細な情報を見つけることができますStructのコンセプトのreferenceにあります。

+1

@seertaakそれはあなたの質問に答えますか?もしそうなら、あなたはそれを受け入れてください、そうでなければ、私はあなたを助けることができ、おそらくライブラリのユーザビリティを改善するために何が欠けているか教えてください。 –

+0

はい、そうです!遅い返信のお詫び – seertaak

関連する問題