1

メンバーをバインドして、クラス インスタンスの外部に関数オブジェクトを格納したいと考えています。ただし、VS2012 では、これは までしか機能せずplaceholders::_4、エラーでポップアップし始めます。たとえば、次のようにします。

#include <iostream>
#include <functional>

using namespace std;
using namespace std::placeholders;

class A
{
    public:
    int method(int a,int b,int c,int d,int e)
    {
        return a;
    }
};

int main()
{
    std::function<int (int,int,int,int,int)> obj;
    A a;

    // error: no instance of overloaded function "std::bind" matches the argument list
    obj = std::bind(&A::method,&a,_1,_2,_3,_4,_5); 

    std::cout << obj(1,2,3,4,5);

   return 0;
}

上記のコードは GCC 4.7.2 では正常にコンパイルされますが、Visual Studio 2012 では上記のエラーが発生します。

4

2 に答える 2

5

Visual Studio は可変個引数テンプレートをサポートしていないため、これは定義によって解決されます。

_VARIADIC_MAX必要なパラメータの量に定義を設定できます。システムヘッダーが含まれる前に設定されるように、プロジェクト設定でこれを行います。

ただし、この値を大きな数に設定すると、コンパイル時間が長くなることに注意してください。

于 2013-10-17T16:19:43.993 に答える
3

代替手段の 1 つは、次のように代わりにラムダを使用することです。

#include <iostream>
#include <functional>

using namespace std;
using namespace std::placeholders;

class A
{
public:
    int method(int a, int b, int c, int d, int e)
    {
        return a;
    }
};

int main()
{
    std::function<int(int, int, int, int, int)> obj;
    A a;

    obj = [&a](int b, int c, int d, int e, int f){return a.method(b,c,d,e,f); };

    std::cout << obj(1, 2, 3, 4, 5);

    return 0;
}

編集: @mkaes の回答に従わなければ、これも機能しないようstd::functionです。

于 2013-10-17T16:25:05.483 に答える