私は非常に単純なことをするファンクターが必要です、基本的にこれ:
template<typename T>
struct Extract
{
T & operator()(T *t)
{
return *t;
}
};
私はコードを複製したくありません。そのような単純で便利なコードはすでにどこかに存在しているはずです。私はそれを探してみましたが、成功しませんでした。
いくつかのコンテナーを反復処理して、ポインターを入れてsmthを実行したいと思いますか?または、既存の関数(std :: plusなど)に基づいて高階関数を作成することもできます...
そのために、Boostライブラリにはいくつかの解決策があります。
どちらも生のポインタで動作するだけでなく、いくつかのスマートポインタのサポートも含まれています...
まず、例に構文エラーがあります。関数呼び出し演算子を次のようにオーバーロードしようとしていると思います。
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);