2017-01-20 2 views
-2

У меня есть карта действий, которые необходимо принять на определенный выбор,станд :: функция от инициализации станд :: привязки в списке инициализатора

struct option { 
    int num; 
    std::string txt; 
    std::function<void(void)> action; 
}; 
void funct_with_params(int &a, int &b) 
{ 
    a = 3; b = 4; 
} 
int param1 = 1; 
int param2 = 3; 

Я хочу, чтобы инициализировать вектор тех, в новом списке инициализатора моды :

const std::vector<option> choices 
{ 
    { 
     1, 
     "sometext", 
     std::bind(&funct_with_params, std::ref(param1), std::ref(param2)) 
    }, 
} 

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

Я смог сделать пример работы, используя выражение лямбда вместо связывания, есть ли что-то, чего я не вижу? Или это не правильный способ использования std::bind?

Я использую C++ 11, так как я не могу перейти на более новый стандарт.

+3

Я [не могу воспроизвести вашу проблему] (http://coliru.stacked-crooked.com/a/9abbe27406d74367). Какую ошибку вы получили? Что ты пытаешься сделать? – WhiZTiM

+0

Я думаю, 'act_with_params' на самом деле' funct_with_params', но как и где вы объявляли 'param1' и' param2'? Пожалуйста, предоставьте [mcve]. – Quentin

+1

какой компилятор? – stefaanv

ответ

3

Проблема заключается в том, что тип переменной элемента действия в опции - std::function<void(void)>, и вы инициализируете опцию с помощью другой функции (std::function<void(int &a, int &b)>). Это связано с функционированием std::bind (std::bind).

Вам нужны правильные типы. Также я могу предположить, потому что вы хотите использовать постоянный вектор, было бы лучше использовать std::array.

Пример кода:

#include <functional> 
#include <vector> 
#include <array> 

struct option { 
    int num; 
    std::string txt; 
    std::function<void(int &a, int &b)> action; 
}; 

void funct_with_params(int &a, int &b){ 
    a = 3; b = 4; 
} 


int main(){ 
    int param1 = 1; 
    int param2 = 3; 

    //vector fill 
    const std::vector<option> choices{ 
     { 1, "sometext", std::bind(funct_with_params, std::ref(param1), std::ref(param2)) } 
    }; 

    //array fill 
    const std::array<option, 1> choices2 = { 
     { 1, "sometext", std::bind(funct_with_params, std::ref(param1), std::ref(param2)) } 
    }; 
    return 0; 
} 

Другим решением будет использование шаблонов.

+1

Это не имеет смысла для меня ... Как только оба параметра связаны, функция является нулевой. Однако вы действительно можете сохранить его внутри 'std :: function ' и называть его еще двумя аргументами, которые игнорируются. Какого черта. – Quentin

+0

Последующий комментарий к моему предыдущему комментарию: это [по дизайну] (http://stackoverflow.com/questions/16164769/understanding-stdfunction-and-stdbind). К сожалению, этот ответ, таким образом, неверен: 'std :: function action' работает и что такое OP. – Quentin

Смежные вопросы