powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / шаблонный класс с нешаблонным констуктором по умолчанию
6 сообщений из 6, страница 1 из 1
шаблонный класс с нешаблонным констуктором по умолчанию
    #39927319
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем доброго времени суток.

Есть шаблонный класс, у которого есть конструктор по умолчанию и мне нужно варьировать его поведение в зависимости от некоторых внешних факторов. Пример
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
template <typename T>
class SomeClass
{
    template <bool b = false>
    SomeClass(void)
    {
        if constexpr (b)
           doSomethingSpecific();
    }

    // прочие шаблонные конструкторы, c различным набором аргументов, включая variadic templates
};


Поскольку нешаблонный параметр не является обязательным, простое использование конструктора по умолчанию автоматически определяет значение b. Например,
Код: plaintext
1.
auto x = SomeClass<int>(); // выглядит как создание объекта с вызовом конструктора по умолчанию


Я не понимаю как мне теперь создать экземпляр класса SomeClass с указанием параметра b = true.
Код: plaintext
1.
auto x = SomeClass<int><true>(); // не прокатывает, компилятор, понятное дело, начинает ругаться на синтаксис


Технически я мог бы применить решение с использованием тегирования, с автоопределением шаблонных аргументов средствами компилятора.
Код: plaintext
1.
2.
3.
template <typename T> struct tag { };
template <bool b = false>
SomeClass(tag<b>)


теперь я могу написать
Код: plaintext
1.
auto x = SomeClass<int>(tag<true>); // автоопределение b как true на основе T из tag


но мне не подходит данное решение, так как в классе SomeClass есть и другие шаблонные конструкторы, которые могут принимать любые значения в составе конструкторов, при этом иметь собственную логику поведения, и в данном случае получается, что я теряю конструктор по умолчанию и создаю конструктор для 1 аргумента типа tag. Подобное не совсем красиво с точки зрения user experience и будет приводить в замешательство при использовании подобного класса: что еще за tag? что туда передавать? я просто хотел создать объект с конструктором по умолчанию!

Нет ли какого-то другого способа вызывать конструктор по умолчанию с нешаблонным аргументом, при этом оставаясь в рамках стандартного подхода к самой "парадигме" конструктора по умолчанию. В идеале хотелось бы следующего или подобного:
Код: plaintext
1.
2.
auto x = new SomeClass<int>(); // вызов конструктора по умолчанию с b = false
auto x = new SomeClass<int>.<true>(); // вызов конструктора по умолчанию с b = true


--------------------------------------------------------------
o(O_O)o
...
Рейтинг: 0 / 0
шаблонный класс с нешаблонным констуктором по умолчанию
    #39927329
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
шаблонный класс с нешаблонным констуктором по умолчанию
    #39927549
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
template <typename T, bool B = false>
class SomeClass
{
    template <bool b = B>
    SomeClass(void)
    {
        if constexpr (b)
           doSomethingSpecific();
    }

    // прочие шаблонные конструкторы, c различным набором аргументов, включая variadic templates
};

auto x = new SomeClass<int, true>();
...
Рейтинг: 0 / 0
шаблонный класс с нешаблонным констуктором по умолчанию
    #39927551
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну или еще проще

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
template <typename T, bool b = false>
class SomeClass
{
    SomeClass(void)
    {
        if constexpr (b)
           doSomethingSpecific();
    }

    // прочие шаблонные конструкторы, c различным набором аргументов, включая variadic templates
};

auto x = new SomeClass<int, true>();
...
Рейтинг: 0 / 0
шаблонный класс с нешаблонным констуктором по умолчанию
    #39927666
Фотография NekZ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно ещё создать шаблонный статик метод в классе и вызывать его явно как SomeClass<int>::Create<true>()
...
Рейтинг: 0 / 0
шаблонный класс с нешаблонным констуктором по умолчанию
    #39927759
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,

спасибо, но однозначно - нет
SomeClass с true и SomeClass с false будут разными не совместимыми между собой типами. Мне это не нужно

NekZ,

примерно так и сделал
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / шаблонный класс с нешаблонным констуктором по умолчанию
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]