2

私は持っている:

  • unarchiveディクショナリとキーを取り、渡されたテンプレート タイプ ( ) に基づいてテンプレート ルーチンをT特殊化して、T
  • structを活用unarchiveしてメンバーを構築する a のコンストラクター

例は次のとおりです。

template <typename T>
T unarchive(const dictionary_t&, key_type key);

struct foo
{
    foo(const dictionary& archive) :
        value_m(unarchive<decltype(value_m)>(archive, value_key))
    { }

    some_value_type value_m;
};

ここで使用する利点は、このコード行を更新せずunarchive<decltype(value_m)>に型を変更できることですvalue_m。型は常にメンバー変数の型に従います。

私が抱えている問題は、より審美的なものです。非常に冗長です。現在、私はマクロを持っています:

#define UNARCHIVE_FOR(var) unarchive<decltype(var)>

fooコンストラクタは次のように変更されます。

foo(const dictionary& archive) :
    value_m(UNARCHIVE_FOR(value_m)(archive, value_key))
{ }

これで、より簡潔ですが、はるかに醜い結果が得られました。マクロなしで同じ結果を達成できますか? 私が望むのは、次のようなものです。

foo(const dictionary& archive) :
    value_m(unarchive<value_m>(archive, value_key))
{ }

これはどのように行うことができますか?

4

2 に答える 2