LINUX.ORG.RU

Template default constructor

 , ,


0

2

Привет всем! Прошу помочь реализовать хотелку в пределах 11 стандарта. Хотелось бы управлять инициализацией членов класса при вызове конструктора по умолчанию. Придумал сделать на шаблонах, но что-то не получается... Пока остановился на такой реализации (привожу простой пример):

struct A {
    template<bool Initialized = true>
    A();
    int a_;
};

template <bool>
A::A()
    :a_()
{

}

template <>
A::A<false>()
{

}

int main()
{
    A a;
    return 0;
}
Но получилось что-то не совсем то....

note: couldn't deduce template parameter ‘<anonymous>’ A a;



Последнее исправление: heaven__12 (всего исправлений: 1)

Умолчание( = true, имя параметра здесь не нужно) перенести из определения в объявление(line 2)

Deleted
()
Ответ на: комментарий от heaven__12
#include <type_traits>

struct A {
    template<typename T = std::true_type> A(T = std::true_type());
    int a_;
};

template<typename T> A::A(T) :a_() {}

template<> A::A<std::false_type>(std::false_type) {}

int main()
{
    A a{std::false_type()},
      b{std::true_type()},
      c;
    return 0;
}

Два умолчания(line 4) не трогать: по умолчательному параметру он тип не выведет

Deleted
()
Ответ на: комментарий от Deleted

Спасибо. Привожу ещё один вариант перегрузки на основе того, что выше

#include <type_traits>
#include <iostream>

using namespace std;

struct A {
    template <typename T = int>
    A(T *stub = nullptr);

    int a_;
};

template<typename T>
A::A(T *)
    :a_()
{
    cout<< "Initialized" << endl;
}

template<>
A::A<void>(void *)
{
    cout<< "Uninitialized" << endl;
}

int main()
{
    A a{(void *)nullptr},
      b,
      c;
    return 0;
}

Uninitialized Initialized Initialized

heaven__12
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.