2

std::stringID からを生成する汎用関数を実装しようとしています(これは ですstd::pair<uint32_,uint32_t>)。

機能は次のとおりです。

typedef uint32_t element_type;

template <element_type type>
std::string to_string (const std::pair<element_type, uint32_t>& id) {
    ....
    const char* name = elemen_type_traits<type>::element_type_name;
    ...
}

次の方法で関数を呼び出すことができます。

std::cout << to_string<ELEMENT_TYPE_FOO> (foo_0) << std::endl;
std::cout << to_string<ELEMENT_TYPE_FOO> (foo_1) << std::endl;

唯一のことは、テンプレート パラメーターが の最初のフィールドと一致することを確認したいということですstd::pair。からパラメータ値を差し引くことは可能std::pair.firstですか?

それが可能かどうかはわかりませんが、最終的には次のようなものが必要です。

std::cout << to_string (foo_0) << std::endl;
std::cout << to_string (foo_1) << std::endl;

前もって感謝します。

4

2 に答える 2

3

タイプ内で値をエンコードする場合、これは実際に達成可能です。

// C++11 'enum class' emulation, you don't want to leak 'foo' everywhere
// also called a "scoped enum"
struct element_type_value{
   enum type{
     foo = 1337
   };
};

template<element_type_value::type V>
struct element_type{};

template<element_type_value::type V>
std::string to_string(std::pair<element_type<V>, uint32_t> const& /*id*/){
  // ...
  const char* name = element_type_traits<V>::element_type_name;
  // ...
}

実例。

もちろん、これはタイプが常に静的に既知の値である場合にのみ機能し、実際にはid.firstもう必要ありません。しかし、私が知る限り、このチェックを達成する他の方法はありません。

私は個人的にはおそらくドロップstd::pairして、他のリファクタリングと一緒にカスタム構造体を作成するでしょう。

struct element_type{
   enum type{
     foo = 1337
   };
};

template<element_type::type V>
struct element_type_id{
  element_type_id(uint32_t id) : id(id){}
  uint32_t id; // or whatever your original std::pair::second represented
};

template<element_type::type V>
std::string to_string(element_type_id<V> const& /*id*/){
  // ...
  const char* name = element_type_traits<V>::element_type_name;
  // ...
}

実例。

于 2012-08-10T12:42:11.857 に答える
0

私が正しく理解していれば、次のように簡単に書くことができます:

std::string to_string (const std::pair<element_type, uint32_t>& id) {
 const element_type type = id.first;
 ....
 const char* name = elemen_type_traits<type>::element_type_name;
 ...
}
于 2012-08-10T12:49:03.590 に答える