Блог пользователя gydgem

Автор gydgem, история, 11 месяцев назад, По-русски

size_t и const char* s могут быть эквивалентны для компилятора в некоторых случаях. Например:

class my_class {
    char* data;
    size_t size;

public: 
    my_class(const char* s) {
        size = strlen(s);
        data = new char[size + 1];
        strcpy(data, s);
    }
    my_class(size_t sz) : size(sz) {
        data = new char[size];
    }

    ~my_class() {
        delete[] data;
    }

    // Другие методы...
};

теперь, если написать

my_class a = "fghd";  // Использует конструктор с const char* s
my_class b(1); // использует конструктор c size_t

то всё работает хорошо, однако

my_class b(0); //компилятор не может выбрать правильный конструктор

как это можно исправить адекватным способом?

  • Проголосовать: нравится
  • +1
  • Проголосовать: не нравится

»
11 месяцев назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

во дела

»
11 месяцев назад, # |
  Проголосовать: нравится +5 Проголосовать: не нравится

Как насчет такого?

template<typename Type, typename = enable_if_t<is_integral_v<Type>>>
my_class(Type sz) {/*...*/}

Явно говорим "Используй конструктор в резолве только если оно целочисленное"

  • »
    »
    11 месяцев назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    спасибо не знал про такие конструкции, пока я этим воспользуюсь

»
11 месяцев назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

my_class b((size_t)0);

  • »
    »
    11 месяцев назад, # ^ |
      Проголосовать: нравится 0 Проголосовать: не нравится

    это конечно классно, но я не сильно хочу в своём коде задумыватся об током

»
11 месяцев назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

Вместо конструкторов использовать функции/методы с разными названиями.