1

別のファンクターまたはラムダ関数をラップし、インデックスパラメーターを自動的に設定する次のファンクターがあります。例は最もよく説明します。私は次のことができます:

auto f = stx::with_index([](int a, int index){ std::cout << a << " " << index << std::endl; });
f(5);
f(3);
f(9);

出力:

5 0
3 1
9 2

ファンクターコードは次のとおりです。

template<class FUNC>
class IndexFunctor
{
public:
    typedef FUNC FUNC_T;

    explicit IndexFunctor(const FUNC_T& func) : func(func), index(0) {}

    template<class... ARGS>
    void operator ()(ARGS&&... args)
    {
        func(args..., index++);
    }

    const FUNC_T& GetFunctor() const
    {
        return func;
    }

    int GetIndex() const
    {
        return index;
    }

    void SetIndex(int index)
    {
        this->index = index;
    }

private:
    FUNC_T func;
    int index;
};

template<class FUNC>
IndexFunctor<FUNC> with_index(const FUNC& func)
{
    return IndexFunctor<FUNC>(func);
}

問題は、値を返す可能性のある関数で使用したいということです。例えば

auto f = stx::with_index([](int a, int index){ return a * index; });
int a = f(5);

しかし、これを機能させるためにファンクターを変更する方法がわかりません。ファンクターが値を返す関数と自動的に返さない関数の両方と互換性があることを望みます。

誰でもいくつかの提案を提供できますか? ありがとう!

VS2012 Microsoft Visual C++ コンパイラを使用しています 2012 年 11 月 CTP

4

1 に答える 1

6

返すものを変更する必要がありoperator()ます。

C++11 を使用している場合は、末尾の戻り値の型を使用して実行できます。

template<typename... Args> 
auto operator ()(Args&&... args) 
-> decltype(func(std::forward<Args>(args)..., index++)) //get return type
{
    return func(std::forward<Args>(args)..., index++);
}
于 2013-08-04T23:26:20.143 に答える