2012-03-01 5 views
-1

есть ли «умная» перегрузка функций в C++?Эффекты обратной перегрузки и перегрузки

для простой:

classname classname::Foo(const classname& t){ 
    classname workVar = t.clone(); 
        //great work, like this GREAT(), that changing workVar; 
    return workVar; 
    } 

        //back-side effect here, changing object 
    void classname::Foo(){ 
    classname workVar = (*this).clone(); 
        //the same, GREAT() changing workVar 
    (*this).copy(workVar); 
    } 

есть любые возможные способы объединить эти две функции в одном?

в первом способе, для изменения текущего объекта:

obj = obj.Foo(obj); 

на втором пути:

obj.Foo(); 

как объединение этих функций в одном withouht переопределение функции?

+4

Не могу понять вопрос. – vulkanino

ответ

1

В вашем втором Foo() вы указываете «это», но это не похоже на функцию члена класса. Является ли это классом :: Foo()?

Обычно клоун() возвращает указатель на вновь созданный объект, который совпадает с созданным вами. Поэтому вы должны назначить его переменной указателя. Хотя он может вернуть ссылку, это будет запутанно, так как вам нужно будет управлять им, т. Е. Удалить его позже, и обычно вы не ожидаете этого сделать ссылку.

Вы не будете назначать клон новому объекту, как вы это делаете.

this. Недопустимый синтаксис в C++, поскольку «это» всегда является указателем.

Если ваш общий вопрос, является ли внешняя функция называется Foo, который принимает константный T & может автоматически вызывать T::Foo, ну boost::bind на самом деле делает что-то довольно умный с тем, что вы можете сделать что-то вроде

boost::bind(&classname::Foo, workVar) 

из снаружи и

boost::bind(&classname::Foo, this) 

изнутри и, если это свободная функция, то

boost::bind(Foo, workVar) 

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

`

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