Как я могу специализировать деструктор только для одного случая или нескольких случаев?

Я могу специализировать деструктор для одного случая, но у меня возникают проблемы с указанием компилятору просто использовать обычный деструктор для любых других случаев:

#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() {}

ЖИТЬ

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