2

次のコードを検討してください。

#include <functional>
#include <vector>
#include <stdint.h>

class CFileOperationWatcher
{
public:
    CFileOperationWatcher() {}

    virtual void onProgressChanged(uint64_t sizeProcessed, uint64_t totalSize, size_t numFilesProcessed, size_t totalNumFiles, uint64_t currentFileSizeProcessed, uint64_t currentFileSize) {}

    virtual ~CFileOperationWatcher() {}

    void onProgressChangedCallback(uint64_t sizeProcessed, uint64_t totalSize, size_t numFilesProcessed, size_t totalNumFiles, uint64_t currentFileSizeProcessed, uint64_t currentFileSize) {
        _callbacks.emplace_back(std::bind(&CFileOperationWatcher::onProgressChanged, this, sizeProcessed, totalSize, numFilesProcessed, totalNumFiles, currentFileSizeProcessed, currentFileSize));
    }

protected:
    std::vector<std::function<void ()> > _callbacks; 
};

int main(int argc, char *argv[])
{
    CFileOperationWatcher w;
    w.onProgressChangedCallback(0,0,0,0,0,0);
}

Visual Studio 2012 でエラー C2780 が発生しました。それほどstd::bind多くの引数を取ることができる定義がないようです。しかし、可変個引数テンプレートを使用し、任意の数の引数を受け入れることになっていませんか?

4

3 に答える 3

2

MSVC++ 2012 には、マクロ機構に依存する偽の可変個引数テンプレートがあります。デフォルトでは、最大 5 つのパラメータに対してのみ機能します。さらに必要な場合は_VARIADIC_MAX、最大 10 個のパラメーターを使用できます。

同様の質問があります。

VC++ は、2013 バージョンで可変個引数テンプレートを追加しました。

于 2013-08-16T21:45:32.227 に答える
1

これは clang (3.3) で正常にコンパイルされるため、VS2012 のコンパイラのバグである必要があります。はい、あなたは正しいです:std::bind()可変個引数テンプレート (C++11) です。http://en.cppreference.com/w/cpp/utility/functional/bindも参照してください。

于 2013-08-16T17:47:24.523 に答える