2

これが私の失敗した試みです:

#define decltype(...) std::identity<decltype(__VA_ARGS__)>::type

template<typename T>
auto* degrade(const T& f) -> decltype(&T::operator())
{
    return &T::operator();
} 

int main()
{
    std::array<void(int), 1> stuff =
    {
        degrade([](int){})
    };
}
4

1 に答える 1

0

あなたが言ったコメントで、

VS2010 はサポートしていません。- 私が使用しているライブラリの Nawaz には、関数ポインターを受け取るメソッドがあります。ラムダを使用する方が少しクリーンになります (大したことではありませんが、VS2010 で可能かどうかを確認したかったのです)。

その場合、ローカル構造体を使用して、その中で静的関数を定義できます。このようなもの(それがあなたを助けるなら)

#include <iostream>

void call(void (*f)(int))
{
    for(int i = 0 ; i < 10 ; i++)
         f(10 * i);
}

int main() 
{
    struct local
    {
        static void print(int i) { std::cout << i << std::endl; }
    };
    call(&local::print);
}

これは便利です - 多かれ少なかれ C++11 ラムダに似ています。静的メンバー関数をローカルに定義し、それを他の関数に渡すことができます。

于 2012-07-16T19:34:46.730 に答える