C++ man page 와 bounded method.

litdream의 이미지

학교다닌 이후 손놓았던 C++ 를 다시 써야할 일이 생겼습니다.
제 desktop 에서 'man 3 std::string' 부터 막히더군요.
혹시, gentoo 에서 (혹은 ubuntu 에서) c++ man page 를 깔아주는 package 를 좀 알려주시면 감사하겠습니다.

현재 문제는, static 이 아닌 실제 Object 의 bounded method 를 포인터로 쓸수 있는가 하는 문제인데요.

class Person {
 private:
  int age;
  std::string name;
 public:
  Person(std::string, int);
  ~Person();
  int getAge() { return this->age; }
  static int sGetAge(Person &p) { return p.getAge(); }
};

대략 이렇다고 가정하면, (문법이 틀렸다면 너그러이 용서를)...

Person p("Man",18);
int (*fp)(Person &p) = Person::sGetAge;

이것이 과연 bounded method 의 pointer 를 잡아내는것이 c++ 에서 가능한것인가 하는거죠.

int (*mp)() = p->getAge;
cout << (*mp)() << endl;   

쉽게 생각하고, 덜렁 저렇게 했떠니, 에러나더군요.

error: invalid conversion from 'int' to 'int (*)()'

즉, p->getAge 의 return type 이 바로 type 으로 인식되어서, 원하는데로 되지 않더군요.
python 에서 쉽게쉽게 잘 쓰다가, 잠깐 당황하게 만드는데, 막상 검색을 했더니,
어려운 문제가 맞더군요. 혹시 좋은 해결책 있으신분?

cdecl의 이미지

참고하세요..

#include <iostream>
using namespace std;
 
 
class Item
{
public:
    void Run();
};
 
void Item::Run()
{
    cout << "Run()" << endl;
}
 
 
int main()
{
    typedef void (Item::*FnType)();
    FnType fn = &Item::Run;
 
    Item item;
    (item.*fn)();
}

--
cdecl

litdream의 이미지

이렇게 하는 방법이 있었군요.
overload 되는 method 는 typedef 에서 따로 설정해주면 되는군요.
감사합니다.

삽질의 대마왕...

삽질의 대마왕...

winner의 이미지

결국 객체를 연결하지 않으면 사용이 불가능한데요.
원하시는 것처럼 일반 fuction 처럼 쓸 수는 없을텐데요.

litdream의 이미지

그런데, Gentoo 에서 C++ man page 가 뭔가요?
도저히 못찾겠어요. doc++ 인가 하고 했더니, 그건 emerge 에서 ebuild 에러 나고요.
우분투는 로컬로 쓸수는 없지만, 일단 네트웍에만 물리면 볼수는 있는데,
이것도 패키지 이름이 도저히 모르겠네요 :)

좀 도와주십시오. 꾸뻑.

삽질의 대마왕...

삽질의 대마왕...

singlet의 이미지

$ locate std::string
/usr/share/gcc-data/i686-pc-linux-gnu/4.1.1/man/man3/std::stringbuf.3.gz
/usr/share/gcc-data/i686-pc-linux-gnu/4.1.1/man/man3/std::stringstream.3.gz
/usr/share/gcc-data/i686-pc-linux-gnu/4.1.1/man/man3/std::string.3.gz
$ equery b /usr/share/gcc-data/i686-pc-linux-gnu/4.1.1/man/man3/std::string.3.gz
[ Searching for file(s) /usr/share/gcc-data/i686-pc-linux-gnu/4.1.1/man/man3/std::string.3.gz in *... ]
<span>sys-devel/gcc-4.1.1</span> (/usr/share/gcc-data/i686-pc-linux-gnu/4.1.1/man/man3/std::string.3.gz)
litdream의 이미지

locate 해봤을때 안나왔는데, 지금보니, 저의 gcc 에 -doc 이 붙어서 컴파일이 되어있었군요.
한번 doc 을 use 에 넣고 다시 해봐야겠습니다.

삽질의 대마왕...

삽질의 대마왕...

litdream의 이미지

gcc with doc 을 하여도, man page 가 안뜨는군요 :(

삽질의 대마왕...

삽질의 대마왕...

singlet의 이미지

doxygen 패키지가 설치돼있는지 확인해보세요.

doldori의 이미지

별로 쓸모는 없겠지만 간단한 함수 개체를 생각해볼 수도 있죠.

template <typename ClassT, typename ReturnT>
class ObjectBinder
{
public:
    ObjectBinder(ClassT& o, ReturnT (ClassT::*p)()) : obj(o), pmf(p) { }
    ReturnT operator()() { return (obj.*pmf)(); }
private:
    ClassT& obj;
    ReturnT (ClassT::*pmf)();
};
 
typedef ObjectBinder<Person, int> PersonBinder;
 
Person p("Man",18);
PersonBinder pb(p, &Person::getAge);
cout << pb() << endl;

이거저거 다 귀찮다 싶으면 boost::bind가 최고입니다.

#include <boost/bind.hpp>
 
cout << boost::bind(&Person::getAge, p)() << endl;

winner의 이미지

value concept 아닌가요?

doldori의 이미지

제가 위에서 보인 코드에서는 reference가 아니지만, 그것도 가능합니다.

boost::bind(&Person::getAge, boost::ref(p))()

즉 Person::getAge()에서 뭔가 변경을 한다면 p 개체가 변경되는 것이지요.
또한 const reference인 boost::cref()도 있습니다.
litdream의 이미지

그런데, 여전히 man std::string 이 안되고 있습니다 :(

삽질의 대마왕...

삽질의 대마왕...

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.