@communistic_sistema
Биохимик, но в программировании немного шарю

Как написать вариадический оператор по SFINAE для умного указателя на Т, который может быть функцией?

у меня есть умный указатель, в данном вопросе назовем его smart_pointer
он шаблонен по template
у меня есть std::is_function_v для проверки, является ли Т функцией (но я думаю что класса return_type будет достаточно, он описан ниже)
я хотел воспользоваться SFINAE для того чтобы выключить перегрузку
в итоге наклепал такой код:
template<typename T>
struct return_type;
template<typename R, typename... Args>
struct return_type<R(Args...)>
{
	using type = R;
};
//-------------------
template<typename R = return_type<T>::type, typename ...Args>
R operator()(Args... args) const {
	return (*reference->instance)(args...);
}

объявил функцию как typedef bool (*function)(short_args&&);
и я не могу взять и сделать так:
smart_pointer<function> sm(foo);
sm(short_args())

потому что возникает ошибка error C3889
в чем ошибка?
  • Вопрос задан
  • 85 просмотров
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Вот минимальный рабочий пример. В вашей реализации return_type проблема в том, что вы этот шаблон применяете к указателю на функцию. Если там поставить * в специализации шаблона - то все компилируется и даже работает.

template<typename T>
struct return_type;
template<typename R, typename... Args>
struct return_type<R(*)(Args...)>
{
	using type = R;
};

typedef bool (*function)(int);

template<typename T>
class smart_pointer {
public:    
    smart_pointer(T func) : func_(func) {}
    
    template<typename R = typename return_type<T>::type, typename ...Args>
    R operator()(Args... args) const {
        return func_(args...);
    }
    
    T func_;
};

bool foo(int t) {
    return t % 2 == 0;
}


int main() {
    smart_pointer<function> sm(&foo);
    std::cout << sm(5);

    return 0;
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы