Как использовать SFINAE с дочерним классом - PullRequest
0 голосов
/ 06 февраля 2020

У меня нет родительского интерфейса, не являющегося шаблоном, и я пытаюсь использовать SFINAE в дочернем классе. Все, что я хочу сделать, это убедиться, что тип первого параметра шаблона может быть создан без каких-либо аргументов. Моя проблема в предварительной декларации. Насколько я понимаю, SFINAE требует, чтобы класс был объявлен заранее и , а затем специализированный. Это то, что я сейчас пытаюсь:

class ParentInterface
{};

template<class, class = void>
class Child : public ParentInterface; // <-- This semi-colon is the error

template<class Ty>
class Child<Ty, std::enable_if_t<std::is_constructible_v<Ty>>>
    : public ParentInterface
{};

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

1 Ответ

1 голос
/ 06 февраля 2020

template<class, class = void> class Child : public ParentInterface;

не является ни декларацией, ни определением.

Вы, вероятно, хотите декларацию:

`template<class, class = void>
class Child;

И затем вы можете добавить определение частичной специализации:

template<class Ty>
class Child<Ty, std::enable_if_t<std::is_constructible_v<Ty>>>
    : public ParentInterface
{};
...