Я пытаюсь проверить, совместим ли функтор с заданным набором типов параметров и заданным типом возврата (то есть данные типы типов могут быть неявно преобразованы в фактические типы параметров и наоборот для возвращаемого типа),В настоящее время я использую следующий код для этого:
template<typename T, typename R, template<typename U, typename V> class Comparer>
struct check_type
{ enum {value = Comparer<T, R>::value}; };
template<typename T, typename Return, typename... Args>
struct is_functor_compatible
{
struct base: public T
{
using T::operator();
std::false_type operator()(...)const;
};
enum {value = check_type<decltype(std::declval<base>()(std::declval<Args>()...)), Return, std::is_convertible>::value};
};
check_type<T, V, Comparer>
Это работает довольно хорошо в большинстве случаев, однако не удается скомпилировать, когда я тестирую функторы без параметров, такие как struct foo{ int operator()() const;};
, потому что вв этом случае два operator()
основания кажутся неоднозначными, что приводит к чему-то вроде этого:
error: call of '(is_functor_compatible<foo, void>::base) ()' is ambiguous
note: candidates are:
note: std::false_type is_functor_compatible<T, Return, Args>::base::operator()(...) const [with T = foo, Return = void, Args = {}, std::false_type = std::integral_constant<bool, false>]
note: int foo::operator()() const
Так что, конечно, мне нужен другой способ проверить это для функторов без параметров.Я попытался сделать частичную специализацию is_functor_compatible
для пустого пакета параметров, где я проверяю, является ли тип &T::operator()
функцией без параметров, которая работает более или менее.Однако этот подход, очевидно, дает сбой, когда у тестируемого функтора несколько operator()
.
. Поэтому мой вопрос заключается в том, существует ли лучший способ проверить наличие 1015 * без параметров и как это сделать.