1

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

template <class Function, class = typename std::enable_if</*SOMETHING*/>::type>
apply(Function&& f);

提供された機能を実行します。

SFINAE を使用するために、関数が次の条件を満たすかどうかを確認したいと思います。

  • に変換可能な1つのパラメーターを取りますconst unsigned int
  • に変換可能なものを返しますstd::string

の代わりに何を書く必要があり/*SOMETHING*/ますか?

4

1 に答える 1

3

You haven't specified a return value for apply, I'll choose int:

#include <string>
#include <type_traits>

template <class Function,
  class = typename std::enable_if<
    std::is_convertible<
      decltype(std::declval<Function>()(std::declval<const unsigned int>())),std::string>::value>::type>
int apply(Function&& f);

Breaking it down: this ensures that a Function:

std::declval<Function>()

called with a const unsigned int parameter:

std::declval<Function()(std::declval<const unsigned int>())

has a return type:

decltype(std::declval<Function()(std::declval<const unsigned int>()))

that is convertible to std::string:

std::is_convertible<decltype(std::declval<Function()(std::declval<const unsigned int>())), std::string>

whew.

于 2013-06-24T06:51:29.770 に答える