Использование концепций для включения функций-членов, когда параметр шаблона является заданным c шаблонным классом - PullRequest
0 голосов
/ 18 апреля 2020

Цель состоит в том, чтобы включить функцию-член, когда параметром шаблона класса является указанный c шаблонный класс Ptr <U>. Следующий код действительно работает, но требует повторения параметра шаблона U.

#include <iostream>
using namespace std;

template <class T> class Ptr
{
public:
};

template <typename T, typename U> concept is_a_Ptr = std::is_same <T, Ptr <U>>::value == true;

template <class T> class Container
{
public:
  void PlainFoo () {};
  template <class U> void OptionalFoo () requires is_a_Ptr <T,U> {};
};

int main(int argc, char* argv[])
{
  Container <Ptr <int>> foo;
  foo.OptionalFoo <int> (); // Requires <int> to be specified
  // foo.OptionalFoo (); // Would like to be able to do this
  return 0;
}

Есть ли способ избежать указания int? Я знаю, что это может быть реализовано со специализацией, но это требует значительного количества рефакторинга кода, поэтому я надеюсь, что этого не потребуется.

1 Ответ

1 голос
/ 18 апреля 2020

Есть ли способ избежать указания int?

Я бы порекомендовал добавить псевдоним типа в Ptr, который бы выглядел так:

template <class T> class Ptr
{
public:
    using type = T;
};

И тогда вы можете по умолчанию задать параметр типа OptionalFoo():

template <class U = typename T::type> 
void OptionalFoo () requires is_a_Ptr <T,U> {};

Таким образом, вам не нужно будет снова указывать тип, и вы можете просто вызвать его как:

Container <Ptr <int>> foo;
foo.OptionalFoo (); // identical to foo.OptionalFoo<int>();
...