powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как сделать шаблонным оператор []?
36 сообщений из 36, показаны все 2 страниц
Как сделать шаблонным оператор []?
    #39633527
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Написал класс- контейнер для хранения произвольных данных:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
    class VariativeData{

        std::map<std::string, std::experimental::any> Map;

    public:
        void Add(const std::string Key, const auto Value)
        {
            Map.insert(Key, Value);
        }

        template <typename Type = std::string>
        Type operator[](const std::string& Key)
        {
            return std::experimental::any_cast<Type> (Map.at(Key));
        }
    };



Сложил значения:
Код: plaintext
1.
2.
VariativeData CurrentSettings;
CurrentSettings.Add("UseOnlySSD",  false);



Теперь не могу получить значение:
Код: plaintext
1.
bool UseOnlySSD = Settings<bool>["UseOnlySSD"];



Код: plaintext
1.
ошибка: expected primary-expression before ‘bool’
             bool UseOnlySSD = Settings<bool>["UseOnlySSD"];
...
Рейтинг: 0 / 0
Как сделать шаблонным оператор []?
    #39633545
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как хранить типы данных, чтобы при получении значений не указывать к какому типа надо приводить полученное значение?

+ Зная тип каждого элемента в деструкторе можно будет автоматически освободить память без оборачивания элементов unique_ptr.
...
Рейтинг: 0 / 0
Как сделать шаблонным оператор []?
    #39633591
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQL,
union?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
#   pragma pack(push, __ALIGN_BYTE)
      typedef union
      {
        inL::INT64  sint64;
        inL::UINT64 uint64;
        inL::INT32  sint32;
        inL::UINT32 uint32;
        inL::INT16  sint16;
        inL::UINT16 uint16;
        inL::INT8   sint8;
        inL::INT8   uint8;
        long int          slong;
        unsigned long int ulong;
        int               sint;
        unsigned int      uint;
        short             sshort;
        unsigned short    ushort;
        char              schar;
        unsigned char     uchar;
        void*             pvoid;
      }
      ANYCAST;
#   pragma pack(pop)

#   define AS_INT64(v)  (((inL::ANYCAST&)v).sint64)
#   define AS_UINT64(v) (((inL::ANYCAST&)v).uint64)
#   define AS_INT32(v)  (((inL::ANYCAST&)v).sint32)
#   define AS_UINT32(v) (((inL::ANYCAST&)v).uint32)
#   define AS_INT16(v)  (((inL::ANYCAST&)v).sint16)
#   define AS_UINT16(v) (((inL::ANYCAST&)v).uint16)
#   define AS_INT8(v)   (((inL::ANYCAST&)v).sint8)
#   define AS_UINT8(v)  (((inL::ANYCAST&)v).uint8)
#   define AS_QWORD(v)  (((inL::ANYCAST&)v).uint64)
#   define AS_DWORD(v)  (((inL::ANYCAST&)v).uint32)
#   define AS_WORD(v)   (((inL::ANYCAST&)v).uint16)
#   define AS_BYTE(v)   (((inL::ANYCAST&)v).uint8)
#   define AS_INT(v)    (((inL::ANYCAST&)v).sint)
#   define AS_UINT(v)   (((inL::ANYCAST&)v).uint)
#   define AS_LONG(v)   (((inL::ANYCAST&)v).slong)
#   define AS_ULONG(v)  (((inL::ANYCAST&)v).ulong)
#   define AS_SHORT(v)  (((inL::ANYCAST&)v).sshort)
#   define AS_USHORT(v) (((inL::ANYCAST&)v).ushort)
#   define AS_CHAR(v)   (((inL::ANYCAST&)v).schar)
#   define AS_UCHAR(v)  (((inL::ANYCAST&)v).uchar)
#   define AS_PVOID(v)  (((inL::ANYCAST&)v).pvoid)

...
Рейтинг: 0 / 0
Как сделать шаблонным оператор []?
    #39633595
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rdb_devAlekseySQL,
union?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
#   pragma pack(push, __ALIGN_BYTE)
      typedef union
      {
        inL::INT64  sint64;
        inL::UINT64 uint64;
        inL::INT32  sint32;
        inL::UINT32 uint32;
        inL::INT16  sint16;
        inL::UINT16 uint16;
        inL::INT8   sint8;
        inL::INT8   uint8;
        long int          slong;
        unsigned long int ulong;
        int               sint;
        unsigned int      uint;
        short             sshort;
        unsigned short    ushort;
        char              schar;
        unsigned char     uchar;
        void*             pvoid;
      }
      ANYCAST;
#   pragma pack(pop)

#   define AS_INT64(v)  (((inL::ANYCAST&)v).sint64)
#   define AS_UINT64(v) (((inL::ANYCAST&)v).uint64)
#   define AS_INT32(v)  (((inL::ANYCAST&)v).sint32)
#   define AS_UINT32(v) (((inL::ANYCAST&)v).uint32)
#   define AS_INT16(v)  (((inL::ANYCAST&)v).sint16)
#   define AS_UINT16(v) (((inL::ANYCAST&)v).uint16)
#   define AS_INT8(v)   (((inL::ANYCAST&)v).sint8)
#   define AS_UINT8(v)  (((inL::ANYCAST&)v).uint8)
#   define AS_QWORD(v)  (((inL::ANYCAST&)v).uint64)
#   define AS_DWORD(v)  (((inL::ANYCAST&)v).uint32)
#   define AS_WORD(v)   (((inL::ANYCAST&)v).uint16)
#   define AS_BYTE(v)   (((inL::ANYCAST&)v).uint8)
#   define AS_INT(v)    (((inL::ANYCAST&)v).sint)
#   define AS_UINT(v)   (((inL::ANYCAST&)v).uint)
#   define AS_LONG(v)   (((inL::ANYCAST&)v).slong)
#   define AS_ULONG(v)  (((inL::ANYCAST&)v).ulong)
#   define AS_SHORT(v)  (((inL::ANYCAST&)v).sshort)
#   define AS_USHORT(v) (((inL::ANYCAST&)v).ushort)
#   define AS_CHAR(v)   (((inL::ANYCAST&)v).schar)
#   define AS_UCHAR(v)  (((inL::ANYCAST&)v).uchar)
#   define AS_PVOID(v)  (((inL::ANYCAST&)v).pvoid)



У меня много нестандартных типов данных.
...
Рейтинг: 0 / 0
Как сделать шаблонным оператор []?
    #39633598
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQL, ну и засунь их все в union! Какая разница? Твой union будет размером с самый большой твой тип.
...
Рейтинг: 0 / 0
Как сделать шаблонным оператор []?
    #39633605
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это вообще не компилируется.
auto в параметрах нельзя, insert принимает пару.
...
Рейтинг: 0 / 0
Как сделать шаблонным оператор []?
    #39633606
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
a guestЭто вообще не компилируется.
auto в параметрах нельзя, insert принимает пару.

Насколько я понял стандарт C++14 позволяет не создавать шаблонов, а писать auto (если этого в функции будет достаточно).
Написал так:
Код: plaintext
1.
Map[Key] = Data;



Все равно ошибка при получении значения остается.
...
Рейтинг: 0 / 0
Как сделать шаблонным оператор []?
    #39633608
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AlekseySQL, auto-параметры могут быть у лямбд.
Текст ошибки намекает, что она где-то до строки с bool, а не в шаблоне.
Скидывай минимальный полный код, думаешь, людям не лень хедеры прописывать?
...
Рейтинг: 0 / 0
Как сделать шаблонным оператор []?
    #39633609
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a guestЭто вообще не компилируется.
auto в параметрах нельзя, insert принимает пару.Еще как можно! Справа указываешь конкретный член объединения, слева - auto.
...
Рейтинг: 0 / 0
Как сделать шаблонным оператор []?
    #39633671
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQL
Код: plaintext
1.
ошибка: expected primary-expression before ‘bool’
             bool UseOnlySSD = Settings<bool>["UseOnlySSD"];


С оператором не получится. Используйте функцию.
Код: plaintext
1.
2.
3.
4.
5.
6.
template <typename Type = std::string>
        Type get(const std::string& Key)
        {
            return std::experimental::any_cast<Type> (Map.at(Key));
        }
bool UseOnlySSD = Settings.get<bool>("UseOnlySSD");
...
Рейтинг: 0 / 0
Как сделать шаблонным оператор []?
    #39633720
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLТеперь не могу получить значение:
Код: plaintext
1.
bool UseOnlySSD = Settings<bool>["UseOnlySSD"];

Конечно не можешь! Здесь, как минимум, надо было писать:
Код: plaintext
1.
bool UseOnlySSD = Settings<bool>[std::string("UseOnlySSD")];

Ведь ты же должен передавать std::string в перегруженный оператор [] по ссылке, а не по значению.
...
Рейтинг: 0 / 0
Как сделать шаблонным оператор []?
    #39633731
blonduser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLНаписал класс- контейнер для хранения произвольных данных:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
    class VariativeData{

        std::map<std::string, std::experimental::any> Map;

    public:
        void Add(const std::string Key, const auto Value)
        {
            Map.insert(Key, Value);
        }

        template <typename Type = std::string>
        Type operator[](const std::string& Key)
        {
            return std::experimental::any_cast<Type> (Map.at(Key));
        }
    };



Сложил значения:
Код: plaintext
1.
2.
VariativeData CurrentSettings;
CurrentSettings.Add("UseOnlySSD",  false);



Теперь не могу получить значение:
Код: plaintext
1.
bool UseOnlySSD = Settings<bool>["UseOnlySSD"];



Код: plaintext
1.
ошибка: expected primary-expression before ‘bool’
             bool UseOnlySSD = Settings<bool>["UseOnlySSD"];


Я бы сделал так...
Описано схематично.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
    // Этот класс хранит произвольные значения
    class CValue{
        CValue(bool);
        CValue(long);
        //и т.д.
        operator long () const {...;}
        operator bool () const {...;}
        //и т.д.
    };

    class VariativeData{

        std::map<std::string, CValue> Map;

    public:
        void Add(const std::string Key, const CValue& Value)
        {
            Map.insert(Key, Value);
        }

        template <typename Type = std::string>
        CValue operator[](const std::string& Key)
        {
            return Map.at(Key);
        }
    };



Сложил значения:
Код: plaintext
1.
2.
VariativeData CurrentSettings;
CurrentSettings.Add("UseOnlySSD",  false);



Получил значение:
Код: plaintext
1.
bool UseOnlySSD = Settings["UseOnlySSD"];
...
Рейтинг: 0 / 0
Как сделать шаблонным оператор []?
    #39633748
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rdb_dev[/src]Конечно не можешь! Здесь, как минимум, надо было писать:
Код: plaintext
1.
bool UseOnlySSD = Settings<bool>[std::string("UseOnlySSD")];

Ведь ты же должен передавать std::string в перегруженный оператор [] по ссылке, а не по значению.[/quot]

Я пробовал убрать знак ссылки в принимающем операторе [] - ошибка все равно сохраняется. Так что походу Anatoly Moskovsky прав- оператор нельзя сделать шаблонным.

Anatoly Moskovsky, спасибо сделал метод at(const std::string&);

blonduser, спасибо, но перечисление типов мне не нравится.
...
Рейтинг: 0 / 0
Как сделать шаблонным оператор []?
    #39633762
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
a guestЭто вообще не компилируется.
auto в параметрах нельзя...

У меня в этом месте компилятор gcc съедает, а Intel- овский пишет ошибку :)
Код: plaintext
ошибка: "auto" is not allowed here

Кстати, хорошее нововведение: у входящих данных редко используются статические методы, поэтому auto в таких ситуациях хватает.
...
Рейтинг: 0 / 0
Как сделать шаблонным оператор []?
    #39633766
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_dev
Код: plaintext
1.
bool UseOnlySSD = Settings<bool>[std::string("UseOnlySSD")];


Ведь ты же должен передавать std::string в перегруженный оператор [] по ссылке, а не по значению.

Код: plaintext
1.
std::string("UseOnlySSD")


Это вообще-то сам компилятор делает, когда надо привести к const string&.
Стыдно не знать :)
...
Рейтинг: 0 / 0
Как сделать шаблонным оператор []?
    #39633769
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot AlekseySQL]Написал класс- контейнер для хранения произвольных данных:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
    class VariativeData{


        template <typename Type = std::string>
        Type operator[](const std::string& Key)
        {
            return std::experimental::any_cast<Type> (Map.at(Key));
        }
    };



Это шаблон функции. Причём, не простой фукнции, а оператора.
Шаблон функции инстанциируется либо явно , по указанию явным образом параметров шаблона,
либо неявно, при этом параметры шаблона определяются параметрами этой фукнции, указанными при вызове.

У тебя ни один из этих способов не может быть использован, т.к. параметры фукнции не являются параметрами
шаблона, а явно указать параметры шаблона при вызове функции ты не можешь, поскольку это ещё и оператор.

Итого, то, чего ты хочешь, вообще не сделать.

Можно было бы указывать параметры шаблона при вызове оператора-фунции по полному имени (я даже не знаю, возможно ли это, но допустим что возможно), но видимо это не то, что ты хочешь, потому что тогда смысла
в операторе нет никакого, можно его заменить обычной функцией.
Что тебе и рекомендую сделать:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
class AAA 
{
  // ....
        template <typename Type = std::string>
        Type get(const std::string& Key) const
        {
            return std::experimental::any_cast<Type> (Map.at(Key));
        }
};


AAA aaa;
auto val = aaa.get<std::string>();
...
Рейтинг: 0 / 0
Как сделать шаблонным оператор []?
    #39633771
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a guestAlekseySQL, auto-параметры могут быть у лямбд.

Не только у лямбд.
auto может быть где угодно.
В объявлении переменной, в шаблонах, в лямбдах...
...
Рейтинг: 0 / 0
Как сделать шаблонным оператор []?
    #39633772
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLЯ пробовал убрать знак ссылки в принимающем операторе [] - ошибка все равно сохраняется. Так что походу Anatoly Moskovsky прав- оператор нельзя сделать шаблонным.Попробуй так:
Код: plaintext
1.
bool UseOnlySSD = Settings[std::string("UseOnlySSD")];

Возможно, в этом случае нормально отработает дедукция шаблонов, потому как запись вида:
Код: plaintext
1.
bool UseOnlySSD = Settings.operator[]<bool>(std::string("UseOnlySSD"));

тебя, как я понимаю, тоже не устроит. :)
...
Рейтинг: 0 / 0
Как сделать шаблонным оператор []?
    #39633774
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyЭто вообще-то сам компилятор делает, когда надо привести к const string&.С какого перепугу? O_o
Если бы там была передача по значения, я бы еще понял, так как один из конструкторов std::string принимает const char*, а в исходном примере передача не по значению, а по ссылке!
...
Рейтинг: 0 / 0
Как сделать шаблонным оператор []?
    #39633817
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AlekseySQLa guestЭто вообще не компилируется.
auto в параметрах нельзя...

У меня в этом месте компилятор gcc съедает, а Intel- овский пишет ошибку :)Надо компилировать с предупреждениями и читать их. Там написано, почему gcc воспринимает auto.

Да, совсем забыл, "возвращаемый" шаблонный тип выводить можно для операторов преобразования типа. А больше нельзя.
Если надо не указывать явно шаблонный тип, придётся использовать proxy-класс https://wandbox.org/permlink/6H7gvQszvlkzT0Ns
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
#include <iostream>
#include <map>
#include <string>


struct Map {
    std::map<std::string, int> m;

    struct Proxy {
        int& elem;

        template<typename T>
        operator T()
        {
            std::cout << typeid(T).name() << '\t' << elem << '\n';
            return T{};
        }
    };
    
    Proxy operator[](const std::string& s)
    {
        return Proxy { m[s] };
    }
};


int main()
{
    Map map;
    
    bool b = map["ass"];
    int i = map["bss"];
}


Выводит
Код: plaintext
1.
2.
b	0
i	0
Да, имена типов замангленные.

Что делать с присваиванием — не знаю. Можно добавить шаблонный оператор присваивания в Proxy, наверное.
...
Рейтинг: 0 / 0
Как сделать шаблонным оператор []?
    #39633818
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiva guestAlekseySQL, auto-параметры могут быть у лямбд.

Не только у лямбд.
auto может быть где угодно.
В объявлении переменной, в шаблонах, в лямбдах...Главное, что не в параметрах функции. Это нововведение — часть Concepts TS.
...
Рейтинг: 0 / 0
Как сделать шаблонным оператор []?
    #39633821
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rdb_devAnatoly MoskovskyЭто вообще-то сам компилятор делает, когда надо привести к const string&.С какого перепугу? O_oПрочти http://eel.is/c draft/dcl.init.ref вдумчиво и внимательно.
...
Рейтинг: 0 / 0
Как сделать шаблонным оператор []?
    #39633898
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devС какого перепугу? O_o
Если бы там была передача по значения, я бы еще понял, так как один из конструкторов std::string принимает const char*, а в исходном примере передача не по значению, а по ссылке!
А как по-вашему работает вот это?
Код: plaintext
1.
2.
std::map<std::string, int> m;
m["a"] = 1;
...
Рейтинг: 0 / 0
Как сделать шаблонным оператор []?
    #39634265
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovskyrdb_devС какого перепугу? O_o
Если бы там была передача по значения, я бы еще понял, так как один из конструкторов std::string принимает const char*, а в исходном примере передача не по значению, а по ссылке!
А как по-вашему работает вот это?
Код: plaintext
1.
2.
std::map<std::string, int> m;
m["a"] = 1;


1) Тут присваивание, а не инициализация.
2) Тут тип слева совпадает с типом справа.
...
Рейтинг: 0 / 0
Как сделать шаблонным оператор []?
    #39634527
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a guest1) Тут присваивание, а не инициализация.
2) Тут тип слева совпадает с типом справа.Ты не понял, у меня по другому поводу диссонанс...
Когда мы объявляем std::map<std::string, int> m, то внутри такого map имеем публичный тип typedef std::string key_type, а при вызове m["a"]=1 используется прототип перегруженного оператора mapped_type& operator[](key_type&& __k) и мне совершенно непонятно - каким образом "a" из const char* превращается в ссылку на std::string, проинициализированный значением "a"?
...
Рейтинг: 0 / 0
Как сделать шаблонным оператор []?
    #39634637
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyА как по-вашему работает вот это?
Код: plaintext
1.
2.
std::map<std::string, int> m;
m["a"] = 1;

Потрясающе!
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
struct TEST
{
  char* value;

  __INLINE
  __fastcall TEST(const char* src)
  {
    size_t len = ::strlen(src);
    if (len)
    {
      this->value = (char*)::malloc(++len);
      if (NULL != this->value)
        ::memcpy(this->value, src, len);
    }
    else
      this->value = NULL;
  }

  __INLINE
  __fastcall ~TEST()
  {
    ::free(this->value);
  }
};

#pragma argsused
int __cdecl main(int argc, char* argv[])
{
  volatile TEST && test = "The test message";
  printf("The test message: %s", test.value);
  return 0;
}

Автоматическая инициализация временного объекта по дедукции соответствующего конструктора и инициализация rvalue ссылки на этот объект. Я в шоке! Никак не могу найти хорошее и подробное описание этого поведения.
...
Рейтинг: 0 / 0
Как сделать шаблонным оператор []?
    #39634715
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rdb_devЯ в шоке!
Надеюсь вы всю жизнь не писали std::string("a")

rdb_devНикак не могу найти хорошее и подробное описание этого поведения.
Выше была ссылка на место в стандарте.

Если кратко, то при присвоении или вызове функции, если типы не совпадают, то производится неявное преобразование (через конструктор или оператор преобразования типа).
Образованное при этом временное значение можно присвоить значение того же типа либо в константную ссылку этого типа.

Вот и все.
...
Рейтинг: 0 / 0
Как сделать шаблонным оператор []?
    #39634738
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyВыше была ссылка на место в стандарте.Ага, разглядел ! :)
...
Рейтинг: 0 / 0
Как сделать шаблонным оператор []?
    #39634764
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyНадеюсь вы всю жизнь не писали std::string("a") Неоднозначность поведения при неявном преобразовании и перегрузке операторов, это то, что меня всегда бесило в C++.
Порой начинаешь скучать по ассемблеру.
...
Рейтинг: 0 / 0
Как сделать шаблонным оператор []?
    #39636504
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rdb_devAnatoly MoskovskyВыше была ссылка на место в стандарте.Ага, разглядел ! :)А подробнее, какой подпункт сработает и почему?
...
Рейтинг: 0 / 0
Как сделать шаблонным оператор []?
    #39636505
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rdb_devкаким образом "a" из const char*"a" это не const char*, а const char[2].
...
Рейтинг: 0 / 0
Как сделать шаблонным оператор []?
    #39636870
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a guest"a" это не const char*, а const char[2].Не вижу разницы...
что
Код: plaintext
1.
const char *test = "a";

что
Код: plaintext
1.
const char test[] = "a";

одинаково.
...
Рейтинг: 0 / 0
Как сделать шаблонным оператор []?
    #39636871
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разницу "почувствует" лишь sizeof(). :)
...
Рейтинг: 0 / 0
Как сделать шаблонным оператор []?
    #39636874
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a guestА подробнее, какой подпункт сработает и почему?
Ответ очевиден из приведенного мной примера: 21360233

P.S. Если ты сам скинул ссылку на нужный раздел черновика стандарта, зачем переспрашивать? :)
...
Рейтинг: 0 / 0
Как сделать шаблонным оператор []?
    #39636978
a guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
rdb_devРазницу "почувствует" лишь sizeof(). :)Думаю, правила инициализации ссылок тоже почувствуют.

rdb_devP.S. Если ты сам скинул ссылку на нужный раздел черновика стандарта, зачем переспрашивать? :)Да так, просто любопытно, ткнёт ли человек, считающий, что тип у "a" это const char*, в правильный пункт.
...
Рейтинг: 0 / 0
Как сделать шаблонным оператор []?
    #39637065
rdb_dev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a guestДа так, просто любопытно, ткнёт ли человек, считающий, что тип у "a" это const char*, в правильный пункт.Пытаешься намекнуть, что const char* не является типом строкового литерала? :)
...
Рейтинг: 0 / 0
36 сообщений из 36, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как сделать шаблонным оператор []?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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