Как я могу специализировать деструктор только для одного случая или нескольких случаев?
Я могу специализировать деструктор для одного случая, но у меня возникают проблемы с указанием компилятору просто использовать обычный деструктор для любых других случаев:
#include <iostream>
template <int = 0>
struct Foo
{
~Foo();
};
int main()
{
{
Foo<> a; // Normal destructor called
}
{
Foo<7> a; // Special destructor called
}
}
template<>
Foo<7>::~Foo() { std::cout << "Special Foo"; }
template<>
Foo<>::~Foo() {} // Normal destructor does nothing.
Это работает нормально, но теперь, если я добавлю еще один аргумент шаблона, например Foo<3> a; тогда компоновщик говорит, что не может найти определение деструктора. Как я могу просто сказать, что я хочу специального деструктора только для номера 7, и обрабатывать любые другие случаи с помощью обычного деструктора?
Я старался:
Foo::~Foo() {} // Argument list missing
Foo<int>::~Foo() {} // Illegal type for non-type template parameter
template<>
Foo<int>::~Foo() {} // Same thing
template<int>
Foo<>::~Foo() {} // Function template has already been defined
1 ответ
Как я могу просто сказать, что я хочу специального деструктора только для номера 7, и обрабатывать любые другие случаи с помощью обычного деструктора?
Общий деструктор должен быть определен как:
template <int I>
Foo<I>::~Foo() { std::cout << "general dtor"; }
За
template<>
Foo<>::~Foo() {} // Normal destructor does nothing.
Поскольку параметр шаблона имеет значение по умолчанию 0
Таким образом, приведенный выше код является лишь специализацией Foo<0>
так же, как то, что вы сделали для Foo<7>
, Это эквивалентно
template<>
Foo<0>::~Foo() {}