0

どうすれば次のようなことができますか?

#include <functional>

#include <boost/functional.hpp>

int foo(int){return 1;};

template<typename T>
int bar(T t)
{
  return 10;/*or something*/
}

int main() {

  bar<   std::ptr_fun<int, int>(foo) > (1);
  bar< boost::ptr_fun<int, int>(foo) > (1);

  return 0;
}

両方のptr_fun-linesで私は得error C2974: 'bar' : invalid template argument for 'T', type expectedました。私の知る限りprt_fun、型をstd::ptr_fun<int, int>(foo)作成しますが、オブジェクトを作成します。関数ポインタusinfを使用して「初期化」された型をできるだけ多くのstdで作成する方法はありますか?

ファンクターを手動でコーディングすることでおそらくこれを解決できますが、ptr_fun-wayがあると信じています。

4

1 に答える 1

3

ptr_funタイプpointer_to_unary_functionのオブジェクトを返します。テンプレートを型パラメーターを取るように宣言したので、それをオブジェクトに渡すことは明らかに機能しません。

このように機能させることができます(テンプレートパラメータを指定する必要はありません。コンパイラによって推測できます)。

#include <iostream>
#include <functional>

int foo(int i)
{
    return i;
}

template<typename TResult, typename TArg>
int bar(std::pointer_to_unary_function<TArg, TResult> p, TArg arg)
{
    return p(arg);
}

int main()
{
    std::cout << bar(std::ptr_fun<int, int>(foo), 42);
}

しかし、あなたは本当に必要ではありませんptr_fun。あなたは単にこのようにそれをすることができます:

#include <iostream>
#include <functional>

int foo(int i)
{
    return i;
}

template<typename TFunc, typename TArg>
int bar(TFunc f, TArg arg)
{
    return f(arg);
}

int main()
{
    std::cout << bar(foo, 42);
}

または、設定したように機能させるには、次のようにします。

int foo(int i) { return i; }

template<typename T>
int bar(T t)
{
    t(42);
}

int main() {
  std::cout << bar( std::ptr_fun<int, int>(foo) );
}

あなたが何を達成しようとしているのかがはっきりしていないので、たくさんの質問があります。

于 2012-07-03T09:15:54.130 に答える