Как вызвать дескриптор статического массива в шаблоне C++?

Как реализовать следующую функцию шаблона в C++11 для поддержки типов массива в качестве параметра шаблона? В настоящее время компиляция завершается с ошибкой, как показано ниже. Есть ли какая-то синтаксическая хитрость, которая работает вокруг?

template<typename T>
void destroy(T &o) { o.~T(); }

int main()
{
    int x;
    char y[3];
    destroy(x);
    destroy(y);
}

Выход:

$ g++ test.cpp
test.cpp: In instantiation of ‘void destroy(T&) [with T = char [3]]’:
test.cpp:9:18:   required from here
test.cpp:2:26: error: request for member ‘~char [3]’ in ‘o’, which is of non-class type ‘char [3]’

Обновление: если буфер оберток типа struct Storage { CharType value; } используется вместо CharType (то есть Storage* вместо CharType*), тогда это может позволить вызывать деструктор массива CharType = через Storage::~Storage(). И это может работать в коде, который вызвал этот вопрос. Однако остается вопрос: разрешено ли явно вызывать деструктор массива фиксированного размера в C++, и если да, то как это сделать?

1 ответ

Решение

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

template<typename T>
void destroy(T &o) { o.~T(); }

template<typename T, size_t N>
void destroy(T (&o)[N]) {
    for(size_t i = N; i-- > 0;)
        destroy(o[i]);
}

Кстати: вызов dtor поддерживается только для имен типов. int это не имя типа. Таким образом, это не сложно, потому что кто захочет явно уничтожить явный фундаментальный тип?

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