is_polymorphic_functor
次の結果を得るためにメタ関数を実装しようとしています。
//non-polymorphic functor
template<typename T> struct X { void operator()(T); };
//polymorphic functor
struct Y { template<typename T> void operator()(T); };
std::cout << is_polymorphic_functor<X<int>>::value << std::endl; //false
std::cout << is_polymorphic_functor<Y>::value << std::endl; //true
それはほんの一例です。理想的には、任意の数のパラメーターに対して機能する必要がありますoperator()(T...)
。2 つのテスト ケースで失敗する @Andrei Tita のソリューションをテストするために使用したテスト ケースをさらにいくつか示します。
そして、私はこれを試しました:
template<typename F>
struct is_polymorphic_functor
{
private:
typedef struct { char x[1]; } yes;
typedef struct { char x[10]; } no;
static yes check(...);
template<typename T >
static no check(T*, char (*) [sizeof(functor_traits<T>)] = 0 );
public:
static const bool value = sizeof(check(static_cast<F*>(0))) == sizeof(yes);
};
の次の実装を利用しようとしますfunctor_traits
:
//functor traits
template <typename T>
struct functor_traits : functor_traits<decltype(&T::operator())>{};
template <typename C, typename R, typename... A>
struct functor_traits<R(C::*)(A...) const> : functor_traits<R(C::*)(A...)>{};
template <typename C, typename R, typename... A>
struct functor_traits<R(C::*)(A...)>
{
static const size_t arity = sizeof...(A) };
typedef R result_type;
template <size_t i>
struct arg
{
typedef typename std::tuple_element<i, std::tuple<A...>>::type type;
};
};
これにより、多相ファンクターに対して次のエラーが発生します。
error: decltype cannot resolve address of overloaded function
この問題を修正しis_polymorphic_functor
て期待どおりに動作させるにはどうすればよいですか?