質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

4回答

1278閲覧

C++における関数の参照の仕方について

ladybug_10

総合スコア3

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/08/25 07:36

知りたいことの概要

関数ポインタのように、関数の参照を定義できることを知りました。
その関数の参照の仕方について、不明な点があるので、それについてご教示いただきたいです。

環境

  • OS: Windows10 64bit Home 2004
  • コンパイラ:MinGW-W64 ver8.1.0

発生している問題

初めに、以下のようなコードで関数の参照を定義して実行したところ、動作させることができました。

cpp

1#include <bits/stdc++.h> 2using namespace std; 3 4int func(int a = 0, int b = 0) {return a - b;} 5 6int main(){ 7 int (&func_ref)(int, int) = func; // 関数funcの参照func_refを定義 8 cout << "Result of func : " << func(5, 1) << endl; 9 cout << "Result of func_ref: " << func_ref(5, 1) << endl; 10} 11// 実行結果 12// Result of func : 4 13// Result of func_ref: 4

しかし、同様のことをクラス内で実行しようと思い、下記のコードを記述したところ、エラーが発生しました。

cpp

1#include <bits/stdc++.h> 2using namespace std; 3 4class Test { 5private: 6 int func(int a = 0, int b = 0) {return a - b;} 7 8public: 9 void do_test(int a, int b) { 10 int (&func_ref)(int, int) = func; // 関数funcの参照func_refを定義 11 cout << "Result of func : " << func(a, b) << endl; 12 cout << "Result of func_ref: " << func_ref(a, b) << endl; 13 } 14}; 15 16int main(){ 17 Test obj; 18 obj.do_test(5, 1); 19}

console

1error: invalid initialization of non-const reference of type 'int (&)(int, int)' 2    from an rvalue of type '<unresolved overloaded function type>' 3 int (&func_ref)(int, int) = func; 4 ^~~~

最初の例と同様に、funcのみをクラスの外に出すと、問題なく実行できます。

質問内容

関数の参照を行う場合、参照したい関数はグローバル空間?に記述しなければならないのでしょうか。もしそうなら、なぜグローバル空間に記述するとOKなのでしょうか。
クラスの中で記述した関数を参照することはできないのでしょうか。

参考

関数への参照と関数ポインタ、func と &func

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

メンバ関数の参照は存在しません。

https://timsong-cpp.github.io/cppwp/n3337/dcl.mptr#3

There is no "reference-to-member" type in C++

投稿2020/08/25 08:16

SaitoAtsushi

総合スコア5684

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ladybug_10

2020/08/25 08:49

規格で決まっているのですね。ありがとうございます。
guest

0

クラス内のメンバ関数にはthisポインタが隠された引数として存在するためです。

thisポインタを用いない場合は静的メンバ関数を用いる事で普通の関数として扱えます。

c++

1class Test { 2private: 3 static int func(int a = 0, int b = 0) {return a - b;}

投稿2020/08/25 08:02

asm

総合スコア15149

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ladybug_10

2020/08/25 08:40

なるほど、メンバ関数にはthisポインタが渡されているのでしたね。納得しました。ありがとうございました。
guest

0

いわゆるデリゲート(Delegate)ですが、みなさんの言う通りC++にはありません。
対症療法?としてstd::bindかboost::bindで実現可能です。
以下はstd::bindの例で、第一引数をthisに固定しているのがポイントかと思います。
(メソッドは隠れた第一引数にthisがある)

C++

1#include <iostream> 2#include <functional> 3 4using namespace std; 5 6class Test { 7private: 8 int func(int a = 0, int b = 0) { return a - b; } 9 10public: 11 void do_test(int a, int b) 12 { 13 auto func_ref = std::bind(&Test::func, this, std::placeholders::_1, std::placeholders::_2); 14 cout << "Result of func : " << func(a, b) << endl; 15 cout << "Result of func_ref: " << func_ref(a, b) << endl; 16 } 17}; 18 19int main() 20{ 21 Test obj; 22 obj.do_test(5, 1); 23}

投稿2020/08/26 02:02

編集2020/08/26 02:04
FKD

総合スコア268

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ladybug_10

2020/08/26 13:42

C#などにはデリゲートという仕組みがあるのですね。std::bindやboost::bindは知りませんでした。参考にさせていただきます。
guest

0

C++では静的な関数(グローバルな関数やクラス所属のstatic関数)自体を示す型とメンバ関数を示す型は全く別物として扱われます。
関数ポインタに対するメンバ関数ポインタの記法はすぐ検索できたんですが、関数参照に対するメンバ関数参照の記法も似たような感じだと思います。

投稿2020/08/25 08:11

kagilinn

総合スコア354

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kagilinn

2020/08/25 08:41

SaitoAtsushi さんのリンク先によると, メンバ関数参照は存在しないようです. 失礼しました.
kagilinn

2020/08/25 09:03

参考までに, メンバ関数ポインタの例を書いておきます. void do_test(int a, int b) { auto func_ptr = &Test::func; // 完全な型を書くと, int (Test::*func_ptr)(int, int) = &Test::func; cout << "Result of func : " << func(a, b) << endl; cout << "Result of func_ptr: " << (this->*func_ptr)(a, b) << endl; }
ladybug_10

2020/08/26 13:43

コメントありがとうございます。メンバ関数ポインタの型はautoで書くとだいぶ楽になるんですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問