Хранение mem_fun в стандартном контейнере

Есть ли способ создать vector< mem_fun_t< ReturnType, MyClass > >?

Я вижу ошибку:

error C2512: 'std::mem_fun1_t<_Result,_Ty,_Arg>' : no appropriate default constructor available

3 ответа

Решение

Вы, конечно, можете создать такой вектор.

#include <vector>
#include <functional>
#include <iostream>

struct MyClass
{
    int a()  { return 1; }
    int b()  { return 2; }
};

int main()
{
    std::vector<std::mem_fun_t<int, MyClass> > vec;
    vec.push_back(std::mem_fun(&MyClass::a));
    vec.push_back(std::mem_fun(&MyClass::b));
    MyClass x;
    for (size_t i = 0; i != vec.size(); ++i) {
        std::cout << vec[i](&x) << '\n';
    }
}

Если у вас возникли проблемы, внимательно прочитайте сообщение об ошибке. Например, std::mem_fun может вернуть все виды оберток, в зависимости от того, что вы передаете ему.

Или действительно, переключитесь на boost или C++0x function,


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

Я действительно не понимаю, почему это не сработает, но на самом деле это довольно уродливое решение. Просто возьми vector<function<ReturnType(MyClass*)>> и быть без тех проблем, присутствующих в связывателях C++03.

mem_fun_t отвечает требованиям, которые должны храниться в контейнере (он может быть копируемым и назначаемым), поэтому ответ - да.

Однако он не может быть сконструирован по умолчанию или сопоставим, поэтому есть некоторые вещи, которые вы не можете сделать с их контейнером, включая:

  • Изменение размера, если вы не предоставите значение для заполнения
  • Построение с ненулевым размером, если вы не предоставите значение для заполнения
  • Сравнение контейнеров

Ошибка, которую вы видите, связана с попыткой изменить размер или создать размер.

Другие вопросы по тегам