6

現在、次のようなテンプレート関数があるとします。

template <class T, class K>
void* get_subobject(K key)
{
  T& obj = function_returning_T_ref<T>();

  // do various other things...

  return &obj[key];
}

そして、ユーザーが独自のコードをマップobjkey戻り値に適用できるように、添字操作を構成可能にしたいと思います。このようなもの:

template <class T, class K, class Op = subscript<T, K>>
void* get_subobject(K key)
{
  T& obj = function_returning_T_ref<T>();

  // do various other things...

  return &Op{}(obj, key);
}

私の質問は、上記のデフォルトのテンプレート パラメータについて、デフォルトで を呼び出すようにここで使用できるsubscript<T,K>標準のテンプレート (の行に沿って) がありますか? に適切なものが見当たりません。std::less<T>Opoperator[]<functional>

このための標準テンプレートがない場合、独自のテンプレートを作成するのが最善std::bind()ですか、それとも追加のオーバーヘッドなしで同じ効果を使用または類似する方法はありますか?

4

1 に答える 1

2

組み込みのテンプレートについては知りませんが、独自のテンプレートを作成するのはそれほど難しくありません (インライン化すると、オーバーヘッドがなくなります)。

template<typename T, typename K>
struct subscript
{
    inline auto operator()(T const& obj, K const& key) const -> decltype(obj[key])
    {
        return obj[key];
    }

    inline auto operator()(T& obj, K const& key) const -> decltype(obj[key])
    {
        return obj[key];
    }
};

暗黙の型で機能するものを作成することもできます (私はこれが一番好きです)。

struct subscript
{
    template<typename T, typename K>
    inline auto operator()(T&& obj, K&& key) const
        -> decltype(std::forward<T>(obj)[std::forward<K>(key)])
    {
        return std::forward<T>(obj)[std::forward<K>(key)];
    }
};

std::functionもちろん、ユーザーは、オブジェクトまたは単純な関数ポインターを含む、独自の準拠する型を渡すことができます。

于 2013-08-19T05:34:40.300 に答える