хранение mem_fun в стандартном контейнере - PullRequest
4 голосов
/ 03 сентября 2010

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

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

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

Ответы [ 3 ]

4 голосов
/ 03 сентября 2010

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

3 голосов
/ 03 сентября 2010

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

#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 или указание размера с помощью конструктора вектора).Вы не можете использовать эти функции.

2 голосов
/ 03 сентября 2010

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

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

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

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

...