2014-02-05 4 views
2

Есть ли способ использовать шаблоны, макросы или их комбинацию для проверки пустого деструктора внутри класса и внутри классов, на которые он наследует? (is_trivially_destructible не производит то, что мне нужно).Проверить наличие пустого деструктора

class Test 
{ 
    public: 
    ~Test(){}; 
}; 

class Temp2 : public Test 
{ 
}; 
+1

Короткий ответ: нет, это невозможно. –

+4

... но чего вы пытаетесь достичь как большего изображения? – Shoe

+0

@Jefffrey Я знаю, что некоторые компиляторы могут удалять циклы, вызывающие пустые деструкторы, но я хочу знать, могу ли я обнаружить пустой деструктор. – user985611

ответ

0

Конструктор «порожняком» ничего не значит, так как любой не стручок объекты членов будет/неявно/быть уничтожена там компилятор (даже если деструктор не объявлен).

Итак, на самом деле, что вы хотите, вероятно,

  • std::is_pod<T>::value

    Осторожно: MSVC gets it wrong (например, для struct X : std::array<int, 4> {} который является стручок)

  • std::is_trivial<T>::value

Идея состоит в том, что конструктор можно пропустить только в том случае, если конструктор не делает ничего волшебного. Конструкция и разрушение предназначены для идеального баланса, поэтому вы знаете, что деструктор тривиален, если строительная сторона тоже.

+0

Для класса * тривиально копируемого * должен иметь тривиальный dtor. Итак, 'is_pod' и' is_trivial' (которые оба требуют * тривиально-скопируемые *) не помогают, если OP отвергает 'is_trivially_destructible'. – dyp

+0

@ dyp Oh. Gee. Я предположил, что «is_trivially_destructible не производит то, что мне нужно», в основном имело смысл, поскольку эта черта не существовала (я не слышал об этом). Дурак я – sehe

Смежные вопросы