Как вызвать дескриптор статического массива в шаблоне 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
это не имя типа. Таким образом, это не сложно, потому что кто захочет явно уничтожить явный фундаментальный тип?