0

私は非常に単純なことをするファンクターが必要です、基本的にこれ:

template<typename T>
struct Extract
{
    T & operator()(T *t)
    {
        return *t;
    }
};

私はコードを複製したくありません。そのような単純で便利なコードはすでにどこかに存在しているはずです。私はそれを探してみましたが、成功しませんでした。

4

2 に答える 2

2

いくつかのコンテナーを反復処理して、ポインターを入れてsmthを実行したいと思いますか?または、既存の関数(std :: plusなど)に基づいて高階関数を作成することもできます...

そのために、Boostライブラリにはいくつかの解決策があります。

どちらも生のポインタで動作するだけでなく、いくつかのスマートポインタのサポートも含まれています...

于 2012-12-05T15:41:12.603 に答える
1

まず、例に構文エラーがあります。関数呼び出し演算子を次のようにオーバーロードしようとしていると思います。

template<typename T>
struct Extract
{
    T& operator()(T *t)
    {
        return *t;
    }
};

次に、これはポインタを参照に変換しているようです。これは、標準ライブラリを使用std::refして行うことができます。std::crefそれらstd::reference_wrapperは値からaを作成するので、に送信する前にポインタ引数を尊重しますstd::ref

あなたの使用方法:

Extract<int> ex;
int n = 1;
int* n_ptr = &n;
int& n2 = ex(n_ptr);

使用方法std::ref

int n = 1;
int* n_ptr = &n;
int& n2 = std::ref(*n_ptr);
于 2012-12-05T15:36:23.403 に答える