Я пытаюсь отключить некоторые функции внутри простого класса шаблона.Функции, которые должны быть удалены, зависят от того, имеет ли аргумент шаблона определенные typedefs.
Пример сводится к следующему:
template<typename T>
struct Foo
{
typename T::Nested foo() { return typename T::Nested(); }
int bar() { return 1; }
};
struct NoNested
{
};
struct WithNested
{
typedef int Nested;
};
int main()
{
Foo<WithNested> fwn;
fwn.foo();
fwn.bar();
Foo<NoNested> fnn;
//fnn.foo();
fnn.bar();
}
Однако это дает мне ошибку стиля error: no type named ‘Nested’ in ‘struct NoNested’
на gccи clang ++ (обратите внимание на старые версии обоих).
Есть ли простой способ удалить foo
, когда typedef T::Nested
не завершается?(Кроме специализации шаблона класса Foo<T>
, как в реальном коде, у меня есть это для примерно 5 функций с разными определениями типов .. что приведет к 2 ^ 5 различным специализациям)
РЕДАКТИРОВАТЬ: Поскольку некоторые просили мотивировать желание сделать это: я хотел бы создать что-то вроде FSM времени компиляции для использования в DSL.
Я хотел бы иметь возможность сделатьthis
struct StateA;
struct StateB;
struct StateC;
struct StateA
{
typedef StateB AfterNext;
};
struct StateB
{
typedef StateA AfterPrev;
typedef StateC AfterNext;
};
struct StateC
{
typedef StateB AfterPrev;
};
template<typename T>
struct FSM
{
FSM<typename T::AfterNext> next() { return FSM<T::AfterNext>(); };
FSM<typename T::AfterPrev> prev() { return FSM<T::AfterPrev>(); };
};
, так что
FSM<StateA>().next().prev().next().next();
компилируется, но
FSM<StateA>().next().prev().prev();
завершается неудачей.
Обратите внимание, что в действительности было бы больше переходовфункций, чем эта, функции перехода на самом деле что-то делают, и FSM будет хранить некоторое состояние.
ОБНОВЛЕНИЕ : я создал правильных примеров , используя методы, которыебыли даны до сих пор.Ответы различаются по сложности, и, хотя метод посетителей - это тот, который я, вероятно, в конечном итоге буду использовать (поскольку он наиболее прост), мое решение (самое сложное) - единственное, которое фактически удаляет функцию.