cpp-ru / ideas

Идеи по улучшению языка C++ для обсуждения
https://cpp-ru.github.io/proposals
Creative Commons Zero v1.0 Universal
89 stars 0 forks source link

Using для статических данных #85

Open apolukhin opened 3 years ago

apolukhin commented 3 years ago

Перенос предложения: голоса +1, -8 Aвтор идеи: dix75

Часто необходимо использовать статические данные в определенном классе или методе и использование полного имени иногда избыточно и не всегда красиво

В качестве примера рассмотрим std::string::npos.

#define NPOS1 (std::string::npos)

class TestOutput {
public:
  static const auto npos2 = std::string::npos;

private:
    static bool empty(std::string const& value) noexcept {
        auto const& npos = std::string::npos;
        return (value.find('{') == std::string::npos || value.find('}') == npos)
            || (value.find('[') == NPOS1 || value.find(']') == npos2)
        ;
    }
};

В кладовой программистов есть несколько вариантов решить данную задачу, очевидные(не все) приведены в примере.

Хотелось бы более простого решения.

class TestOutput {
public:
  using variable npos = std::string::npos;

private:
    static bool empty(std::string const& value) noexcept {
        return (value.find('{') == npos || value.find('}') == npos)
            || (value.find('[') == npos || value.find(']') == npos)
        ;
    }
};

Известно, что using используется для типов, using namespace - для пространств имен. Возможно, using variable будет приемлемо для данного использования.

P.S. Конечно решить данную задачу можно и подручными средствами, но это только пример, а в реальном коде ситуация в разы интереснее.

apolukhin commented 3 years ago

none, 20 декабря 2016, 19:17 чем static constexpr auto npos = std::string::npos; не устроил?

apolukhin commented 3 years ago

В C++ using хорошо работает для enum, но не работает для значений.

struct struct_v { static constexpr int value = 42; };
enum class enum_v { value = 42 };

void test() {
    using enum_v::value;
    //using struct_v::value; // compilie time error
}

Кажется что тут есть что подправить и стоит сделать поведение симметричным с enum