2016-06-24 2 views
0

Представьте функцию func, которая нуждается во вводе var во время выполнения. Возможно ли в C++ вызвать func без var в качестве параметра? То есть, чтобы иметь что-то вроде этоговызов функции C++

func(var, i) = func(i);

Я хотел бы сделать это ради простой читаемости. Внутри моего класса я мог установить var в качестве глобального параметра, а затем вызвать только func(i), но это дало бы проблемы, если бы я собирался использовать темы ...

Но обратите внимание, что func использует var во время работы. Пример:

int func(int var , int i){ 
return i+var; 
} 

На самом деле у меня будет несколько вызовов FUNC(), но все Thes звонки одни и те же var. Пример: вместо

int var=2; 
int res= func(var, 0) + func(var, 1) +..... func(var, n); 

Я хотел бы написать более сжато (в нем те же var)

int var=2; 
int res= func(0) + func(1) +..... func(n); 
+0

ок я попытаюсь заново отредактировать мой вопрос, я думаю, что жесткий @Yuushi обеспечил решение – Courier

+0

@ Garf365 Я просто переиздан. – Courier

+0

см. Мой новый ответ – Garf365

ответ

2

Вы можете сделать это с помощью лямбды:

auto bound_func = [var](auto i) { return func(var, i); } 

Или вы можете иметь более свобода путем простого хранения var в структуре:

struct func_binder 
{ 
    var v_; 

    func_binder(var v) 
     : v_(v) 
    { } 

    decltype(func(v_, i)) operator()(int i) 
    { 
     return func(v_, i); 
    } 
}; 

Это может быть использовано как:

func_binder f(some_var); 
f(some_i); 

Если var это не мутировали функцией, то вам не нужно беспокоиться об этом с потоками. Если это так, то оно должно быть завернуто в структуру, которая каким-то образом синхронизирует с ней доступ.

+0

Это кажется решением. Но как это сделать внутри класса? – Courier

0

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

fun(type_of_i i,typeofvar var=default_value); 

пытается использовать наиболее соответствующее значение для значения по умолчанию Конечно, вы должны быть в состоянии переставить порядок параметров, в противном случае использовать механизм перегрузки функции, как сказано в предыдущем ответе приветствует

0

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

void func(int i, int var=0); 

затем вызвать его как то func(i);

которая func(i, 0);

1

Добавить новую функцию с тем же именем, который принимает параметр я. Эта функция может вызывать другую функцию с помощью Правильный var. Это называется перегрузкой функций.

func(i){ 
    func(global_var, i); 
} 
2

Как насчет?:

auto func_binded = std::bind(func, var, std::placeholders::_1); 
0

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

  • Используйте VARIADIC шаблон для создания функции-оболочки (мое предпочтительное решение в вашем случае , легко добавить в класс). Это решение позволяет писать int r = newfunc(var, 1, 2, 3); вместо того чтобы повторять снова и снова функционировать имя:

    int funcvar(int var) 
    { 
        return 0; 
    } 
    
    template<typename TFirst, typename ... T> 
    int funcvar(int var, TFirst first, T ... args) 
    { 
        return func(var, first) + funcvar(var, args...); 
    } 
    
  • Используйте лямбда (немного быть трудно добавить к классу, потому что вам нужно переменную типа, как std::function<int(int)> fvl и инициализируется в конструкторе или передать его аргумент):

    auto fvl = [var](int i) { return func(var, i); }; 
    

примеры:

int main() 
{ 
    int var = 1; 

    // Use of variadic template 
    int result1 = funcvar(var, 1, 2, 3, 4, 5); 
    int result2 = funcvar(var, 5, 6); 

    // Use of lambda 
    auto fvl = [var](int i) { return func(var, i); }; 
    int result3 = fvl(1) + fvl(2) + fvl(3) + fvl(4) + fvl(5); 
    int result4 = fvl(5) + fvl(6); 

    std::cout << result1 << std::endl; 
    std::cout << result2 << std::endl; 
    std::cout << result3 << std::endl; 
    std::cout << result4 << std::endl; 
} 

см here

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