pointer to overloaded member functions
От: yatagarasu Беларусь  
Дата: 07.12.09 16:53
Оценка:
А как ?

class gps_position 
{
public:
    bool empty() const { return true; }
    bool empty(bool b) const { return b; }
};

boost::function2<bool, const gps_position *, void> bfe1 = &gps_position::empty;
boost::function2<bool, const gps_position *, bool> bfe2 = &gps_position::empty;


А как?

ps. знаю что боян, но чет поиск не понял.
Re: pointer to overloaded member functions
От: yatagarasu Беларусь  
Дата: 07.12.09 17:02
Оценка:
Здравствуйте, yatagarasu, Вы писали:

Y>А как ?


Y>
Y>class gps_position 
Y>{
Y>public:
Y>    bool empty() const { return true; }
Y>    bool empty(bool b) const { return b; }
Y>};

Y>boost::function2<bool, const gps_position *, void> bfe1 = &gps_position::empty;
Y>boost::function2<bool, const gps_position *, bool> bfe2 = &gps_position::empty;
Y>


Y>А как?


Y>ps. знаю что боян, но чет поиск не понял.


без констов вкурил что можно сделать так

typedef bool (gps_position::*func1_t)();
typedef bool (gps_position::*func2_t)(const bool &);

boost::function<bool (gps_position *)>       bfe1 = (func1_t)&gps_position::kill;
boost::function<bool (gps_position *, bool)> bfe2 = (func2_t)&gps_position::kill;


а куда модифаеры то присобачить?
Re: pointer to overloaded member functions
От: -MyXa- Россия  
Дата: 07.12.09 17:15
Оценка: 2 (1)
Здравствуйте, yatagarasu, Вы писали:

Y>boost::function2<bool, const gps_position *, void> bfe1 = &gps_position::empty;

Y>boost::function2<bool, const gps_position *, bool> bfe2 = &gps_position::empty;
Y>[/ccode]

Y>А как?


boost::function1<bool, const gps_position *> bfe1 = static_cast<bool (gps_position::*)() const>(&gps_position::empty);
boost::function2<bool, const gps_position *, bool> bfe2 = static_cast<bool (gps_position::*)(bool) const>(&gps_position::empty);

И мешаем палкой, прямо там, в ведёрке-ма. (С)
Если не поможет, будем действовать током... 600 Вольт (C)
Re[2]: pointer to overloaded member functions
От: wander  
Дата: 07.12.09 23:01
Оценка:
Здравствуйте, yatagarasu, Вы писали:

Y>а куда модифаеры то присобачить?


Сюда:
typedef bool (gps_position::*func2_t)(bool) const;
Re: pointer to overloaded member functions
От: rg45 СССР  
Дата: 07.12.09 23:24
Оценка: 7 (2)
Здравствуйте, yatagarasu, Вы писали:

Y>А как ?


А так:
//Код полностью соответствует требованиям стандарта.
//Проверка на компилуемость выполнена ;)
#include <boost/function.hpp>

typedef bool Empty0() const;
typedef bool Empty1(bool) const;

class gps_position 
{
public:
    Empty0 empty;
    Empty1 empty;
};

boost::function1<bool, const gps_position*> bfe1 = static_cast<Empty0 gps_position::*>(&gps_position::empty);
boost::function2<bool, const gps_position *, bool> bfe2 = static_cast<Empty1 gps_position::*>(&gps_position::empty);

/////////////////////////////////////////////////
bool gps_position::empty() const { return true; }
bool gps_position::empty(bool b) const { return b; }


--
Справедливость выше закона. А человечность выше справедливости.
Re: pointer to overloaded member functions
От: Sni4ok  
Дата: 07.12.09 23:36
Оценка:
Здравствуйте, yatagarasu, Вы писали:

ваша функция член gps_position'а имеет скрытый параметр- указатель на gps_position, сотвественно чтобы её вызывать нужно передавать этот самый указатель

boost::function<bool (const gps_position *)> bfe1 = boost::bind(&gps_position::empty, _1);
boost::function<bool (const gps_position *, bool)> bfe2 = boost::bind(&gps_position::empty, _1, _2);


или делайте функцию член статической, тогда там this'а не будет.
Re[2]: pointer to overloaded member functions
От: yatagarasu Беларусь  
Дата: 08.12.09 11:05
Оценка:
Здравствуйте, rg45, Вы писали:

R>Здравствуйте, yatagarasu, Вы писали:


Y>>А как ?


R>А так:

R>
R>//Код полностью соответствует требованиям стандарта.
R>//Проверка на компилуемость выполнена ;)
R>#include <boost/function.hpp>

R>typedef bool Empty0() const;
R>typedef bool Empty1(bool) const;

R>class gps_position 
R>{
R>public:
R>    Empty0 empty;
R>    Empty1 empty;
R>};

R>boost::function1<bool, const gps_position*> bfe1 = static_cast<Empty0 gps_position::*>(&gps_position::empty);
R>boost::function2<bool, const gps_position *, bool> bfe2 = static_cast<Empty1 gps_position::*>(&gps_position::empty);

R>/////////////////////////////////////////////////
R>bool gps_position::empty() const { return true; }
R>bool gps_position::empty(bool b) const { return b; }
R>


R>


ток не понятно зачем такое может понадобится.
и запись Empty0 gps_position::* выглядит очень странной.

boost::function2<bool, const gps_position *, bool>

а тут const какой-нить смысл имеет?
Re[2]: pointer to overloaded member functions
От: wander  
Дата: 08.12.09 12:03
Оценка:
Здравствуйте, rg45, Вы писали:

R>Здравствуйте, yatagarasu, Вы писали:


Y>>А как ?


R>А так:

R>
R>#include <boost/function.hpp>

R>typedef bool Empty0() const;
R>typedef bool Empty1(bool) const;

R>class gps_position 
R>{
R>public:
R>    Empty0 empty;
R>    Empty1 empty;
R>};

R>boost::function1<bool, const gps_position*> bfe1 = static_cast<Empty0 gps_position::*>(&gps_position::empty);
R>boost::function2<bool, const gps_position *, bool> bfe2 = static_cast<Empty1 gps_position::*>(&gps_position::empty);

R>/////////////////////////////////////////////////
R>bool gps_position::empty() const { return true; }
R>bool gps_position::empty(bool b) const { return b; }
R>


По мотивам вышепроцитированного:

template <typename FuncT, typename Class>
FuncT Class::* extract(FuncT Class::* func)
{
    return func;
}

boost::function1<bool, const gps_position*> bfe1       = extract<bool() const>(&gps_position::empty);
boost::function2<bool, const gps_position*, bool> bfe2 = extract<bool(bool) const>(&gps_position::empty);
Re[3]: pointer to overloaded member functions
От: rg45 СССР  
Дата: 08.12.09 15:47
Оценка:
Здравствуйте, yatagarasu, Вы писали:

Y>
Y>boost::function2<bool, const gps_position *, bool>
Y>

Y>а тут const какой-нить смысл имеет?

Нет, конечно, просто для большей полноты картины. Написано под впечатлением от этой ветки: Вариации на тему деклараций
Автор: rg45
Дата: 08.12.09
--
Справедливость выше закона. А человечность выше справедливости.
Re[3]: pointer to overloaded member functions
От: Юрий Жмеренецкий ICQ 380412032
Дата: 09.12.09 17:59
Оценка:
Здравствуйте, wander, Вы писали:

W>По мотивам вышепроцитированного:

...
W>boost::function1<bool, const gps_position*> bfe1 = extract<bool() const>(&gps_position::empty);

W>[/ccode]


'const' не может быть использован в таком контексте, см 8.3.5/4.
Re[4]: pointer to overloaded member functions
От: wander  
Дата: 11.12.09 11:12
Оценка: 1 (1)
Здравствуйте, Юрий Жмеренецкий, Вы писали:

ЮЖ>Здравствуйте, wander, Вы писали:


W>>По мотивам вышепроцитированного:

ЮЖ>...
W>>boost::function1<bool, const gps_position*> bfe1 = extract<bool() const>(&gps_position::empty);

W>>[/ccode]


ЮЖ>'const' не может быть использован в таком контексте, см 8.3.5/4.


Прочитал,теперь прошу пояснить чем в данном контексте
extract<bool() const>(&gps_position::empty);


отличается от
typedef bool empty1() const;

extract<empty1>(&gps_position::empty);
Re[5]: pointer to overloaded member functions
От: Юрий Жмеренецкий ICQ 380412032
Дата: 11.12.09 13:47
Оценка:
Здравствуйте, wander, Вы писали:

ЮЖ>>'const' не может быть использован в таком контексте, см 8.3.5/4.


W>Прочитал,теперь прошу пояснить чем в данном контексте

W>
W>extract<bool() const>(&gps_position::empty);
W>


W>отличается от

W>
W>typedef bool empty1() const;

W>extract<empty1>(&gps_position::empty);
W>


Поторопился, нельзя вот так:
template<class T> struct X<T() const> {};
Re[5]: pointer to overloaded member functions
От: Николай Ивченков  
Дата: 11.12.09 19:21
Оценка: 4 (1) +1
wander:

ЮЖ>>'const' не может быть использован в таком контексте, см 8.3.5/4.


W>Прочитал,теперь прошу пояснить чем в данном контексте

W>
W>extract<bool() const>(&gps_position::empty);
W>


W>отличается от

W>
W>typedef bool empty1() const;

W>extract<empty1>(&gps_position::empty);
W>

Лично я не вижу в стандарте гарантий корректности ни того, ни другого.

8.3.5/7:

A typedef of a function type whose declarator includes a cv-qualifier-seq shall be used only to declare the function type for a nonstatic member function, to declare the function type to which a pointer to member refers, or to declare the top-level function type of another function typedef declaration.

Формулировка стандарта в очередной раз не блещет ясностью. Что значит "declare funtion type"? Насколько я понимаю, "объявить тип" означает объявить имя, обозначающее тип. В случае объявления нестатической функции-члена её тип не объявляется (он может лишь использоваться в decl-specifier-seq). Возможно, здесь имеется в виду, что при соблюдении остальных правил такой псевдоним может законно использоваться только:

1) в качестве decl-specifier при объявлении нестатической функции-члена внутри определения класса;
2) в качестве decl-specifier или type-specifier-seq, за которым следует либо declarator вида ptr-operator declarator, либо abstract-declarator вида ptr-operator abstract-declarator opt, где ptr-operator имеет вид ::opt nested-name-specifier * cv-qualifier-seq opt;
3) в качестве decl-specifier в typedef declaration.

В таком случае указание подобного псевдонима шаблонным аргументом оказывается в пролёте. На практике с этого тоже ничего хорошего не выходит:

typedef int F1() volatile;
typedef int F2() const;
typedef int F3();

template <class T>
struct X {};

bool f(X<F1>);
void f(X<F2>) {}
void f(X<F3>) {}

int main() {}

Comeau online и Intel C++ 11.0 cчитают, что типы X<F1>, X<F2> и X<F3> совпадают.
GNU C++ 4.1.2 считает, что эти типы разные.
VC++ 9.0 вообще показывает интересные результаты: компилятор считает, что эти типы разные, а линкер — что они одинаковые.

GNU C++ тоже не без прикола.

8.3.5/4:

The effect of a cv-qualifier-seq in a function declarator is not the same as adding cv-qualification on top of the function type, i.e., it does not create a cv-qualified function type.

Несмотря на это, GNU C++ пытается удалить top level cv-qualifier при попытке применить typeid: http://codepad.org/FsiC3q5J
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.