Я хотел бы, чтобы определение конструктора по умолчанию переключалось во время компиляции с помощью параметра шаблона. Я могу заставить это скомпилировать OK для конструктора преобразования, но пытаюсь использовать этот метод для конструктора по умолчанию, чтобы он был по умолчанию или нет - полезно, если в случае определенного параметра шаблона результирующий класс может быть POD, но в другом случае , это невозможно, но при этом я получаю ошибку компилятора. За исключением специализации шаблона и дублирования всего кода, есть ли способ сделать это? Вот упрощенная версия того, что я пытался:
#include<type_traits> // for enable_if
template <bool MyParameter>
class Demonstration
{
public:
//trivial copy, move constructors/assignment, and trivial destructor
constexpr Demonstration(Demonstration const &) = default;
constexpr Demonstration(Demonstration &&) = default;
Demonstration & operator= (Demonstration const &) = default;
Demonstration & operator= (Demonstration &&) = default;
~Demonstration() = default;
// this one gives "error: a template cannot be defauled"
template <bool Dummy=MyParameter, typename std::enable_if< Dummy , bool >::type=true >
Demonstration() = default;
// ok
template <bool Dummy=MyParameter, typename std::enable_if< !Dummy , bool >::type=false >
Demonstration() : myValue(0) {}
// ok
template <bool Dummy=MyParameter, typename std::enable_if< Dummy , bool >::type=true >
explicit constexpr Demonstration(unsigned char toConvert)
: myValue ( toConvert )
{
}
// ok
template <bool Dummy=MyParameter, typename std::enable_if< !Dummy , bool >::type=false >
explicit constexpr Demonstration(unsigned char toConvert)
: myValue ( toConvert > 100 ? 0 : toConvert )
{
}
// a lot of functions that do not depend on parameter go here
protected:
private:
unsigned char myValue;
};
Demonstration<true>
технически все равно не будет POD. Тривиальный класс — это класс, который имеет конструктор по умолчанию, не имеет нетривиальных конструкторов по умолчанию и может быть легко скопирован.Demonstration<true>
имеет два конструктора по умолчанию и один нетривиальный, хотя он никогда не может быть жизнеспособной функцией для разрешения перегрузки. - person aschepler   schedule 06.04.2014Demonstration
. - person Constructor   schedule 06.04.2014