如何针对一个案例或某些案例专门设计析构函数?

时间:2017-10-05 05:09:58

标签: c++ templates destructor template-specialization

我可以专门针对一个案例使用析构函数,但是我无法告诉编译器只使用普通的析构函数来处理其他任何情况:

#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&lt; 3&gt;一个;然后链接器说它无法找到析构函数定义。我怎么才能说我想要一个特殊的析构函数只是为了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 个答案:

答案 0 :(得分:4)

  

我怎么能说我想要一个特殊的析构函数只是为了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() {}

LIVE