Хранение 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
отвечает требованиям, которые должны храниться в контейнере (он может быть копируемым и назначаемым), поэтому ответ - да.
Однако он не может быть сконструирован по умолчанию или сопоставим, поэтому есть некоторые вещи, которые вы не можете сделать с их контейнером, включая:
- Изменение размера, если вы не предоставите значение для заполнения
- Построение с ненулевым размером, если вы не предоставите значение для заполнения
- Сравнение контейнеров
Ошибка, которую вы видите, связана с попыткой изменить размер или создать размер.