Бих искал дефиницията на конструктора по подразбиране да бъде превключвана по време на компилиране чрез параметър на шаблон. Мога да накарам това да компилира ОК за конструктор на преобразуване, но се опитвам да използвам този метод за конструктор по подразбиране, за да бъде по подразбиране или не - полезно, ако в случай на конкретен параметър на шаблона, полученият клас може да бъде 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