Как определить, может ли метод базового типа, хранящийся в shared_ptr, быть вызван с одним параметром или без него во время компиляции

Использование С++ 17. У меня есть следующее:

      template <typename T>
using ptr_t = std::shared_ptr<const T>;

class some_type;

class A { some_type foo() const; }
class B { some_type foo() const; }
class C { some_type foo(int) const; }

std::variant<ptr_t<A>, ptr_t<B>, ptr_t<C>>;

Вариант содержит shared_ptr(s) для разных типов. Ожидается, что все они будут иметь функцию foo() , которая может быть недействительной или принимать параметр. Затем у меня будет посетитель, который правильно отправит foo, что-то вроде этого (концептуально):

      struct visitor
{
  template <typename T>
  ptr_t<some_type> operator()(const T& config) const
  {
    if constexpr (// determine if foo() of the underlying type of a shared_ptr can be called with int param)
        return config->foo(15);
    else
        return config->foo();
  }

есть ли способ сказать это? Я пробовал разные способы, но не могу найти что-то, что компилируется. Параметр шаблона T равен ptr_t<A|B|C>.

0 ответов

Другие вопросы по тегам