Мне нужен кто-то, кто объяснит мне эти строки кода - PullRequest
0 голосов
/ 22 января 2011

Мне нужен кто-то, кто объяснит мне этот код, строка за строкой. Я специально не понимаю эту строку:

operator std::map<T, U>()

Большое спасибо.

template <typename T, typename U>
class create_map 
{ 
    std::map<T, U> m_map;
public:
    create_map(const T& key, const U& val) 
    {  
        m_map[key] = val;
    }
    create_map<T, U>& operator()(const T& key, const U& val) 
    {
        m_map[key] = val;
        return *this;
    }
    operator std::map<T, U>()     
    {
        return m_map;     
    }
};

Ответы [ 4 ]

6 голосов
/ 22 января 2011
operator std::map<T, U>()     
{
         return m_map;     
} 

Это пользовательская функция преобразования .

Это означает, что вы можете написать это:

//obj is an object of type create_map
create_map<int,std::string> obj(1,"Nawaz");

//obj implicitly converts into std::map type!
std::map<int,std::string> map_inst=obj;

узнать больше о пользовательской функции преобразования :

пользовательских преобразований в C ++

Вы также можете увидеть это: Неявное преобразованиепоследовательности (только C ++)


create_map<T, U>& operator()(const T& key, const U& val) 
{
      m_map[key] = val;
      return *this;
}

Это фактически перегружает operator(), который внутренне вставляет или обновляет (key, val) пару в m_map;просто посмотрите определение функции относительно того, что она делает.

Таким образом, используя эту функцию, вы можете написать такой код,

obj(2,"Sarfaraz"); //this inserts the pair into the underlying m_map;

Я бы также предложил вам изучить std::map немного больше, особенно перегруженный operator[] в std::map.

1 голос
/ 22 января 2011

Код:

template <typename T, typename U>
class create_map 
{ 
    std::map<T, U> m_map;
public:
    create_map(const T& key, const U& val) 
    {  
        m_map[key] = val;
    }
    create_map<T, U>& operator()(const T& key, const U& val) 
    {
        m_map[key] = val;
        return *this;
    }
    operator std::map<T, U>()     
    {
        return m_map;     
    }
};

Цель этого кода - определить карту с определенными парами ключ / значение путем объединения вызовов в operator(), например

create_map<int, std::string>( 1, "blah" )( 2, "hah" )( 3, "doh" )

Поскольку класс не имеет конструктора по умолчанию, его нельзя использовать для создания пустой карты.Это может быть по замыслу.Или это может быть ошибка проектирования.

operator std::map<T, U>()     
{
    return m_map;     
}

определяет преобразование в std::map<T, U>, которое является конечным результатом всего этого.

Это может бытьвызывается неявно везде, где указано create_map и ожидается std::map, например, использование выражения create_map в качестве аргумента в вызове функции.

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

Так что вместо этого должно быть

operator std::map<T, U> const& () const
{
    return m_map;     
}

const в концепозволяет create_map быть объявленным как const и использоваться.

При таком преобразовании в ссылку возникает та же проблема, что и при использовании аргументов ссылки, а именно теоретическая возможность создания псевдонимов, когда код, который сохраняетссылка на const не готова к изменениям упомянутого объекта.Но на практике это не проблема.Например, в качестве формального аргумента каждый просто пишет std::string const& s (вместо просто std::string s) как само собой разумеющееся, и очень мало, если какие-либо ошибки возникают в результате этого - у меня никогда не возникало никаких проблем.

Приветствия & hth.,

0 голосов
/ 22 января 2011

Там не так много, чтобы понять об этом. operator std::map<T, U>() переопределяет оператор преобразования класса (который не принимает параметров) для предоставления экземпляра объекта типа std::map<T, U>. std::map - это стандартный класс STL для хранения ассоциативных ключей-> значений. В вашем случае он сопоставляется от ключей типа T со значениями типа U. T и U до сих пор не определены (вы написали template class, но где параметры шаблона?)

Оператор преобразования позволяет использовать экземпляр класса вместо типа, для которого этот оператор обеспечивает преобразование, например так.

class foo {
    operator char const *() {
        return "foo instance as char const *";
    }
};

// ...

void bar(foo &f)
{
    // here the class instance is used as if it were a char const *
    cout << f << endl;
}
0 голосов
/ 22 января 2011

Строка

operator std::map<T, U>()

определяет функцию, которая будет вызываться, когда ваш объект create_map используется как std :: map где-то в коде.

Более простой пример:

class A
{
public:
  operator int()
  {
    return 3;
  }
};

int main()
{
  A a;
  cout << a << endl;
}

Теперь компьютер узнает, что он не знает, как печатать переменную a, но знает, как преобразовать ее в тип int, а затем распечатать.Таким образом, «3» печатается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...