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

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

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

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

Q&A

解決済

2回答

969閲覧

添え字演算子を呼ばれ方によってオーバーロード出来るか

baito

総合スコア7

C++

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

0グッド

2クリップ

投稿2020/04/17 13:11

実現したいこと

my_vector<int> vec(10, -1);
vec[i] = 0;
int v = vec[i];
のようなコードで、2行目と3行目の添え字演算子を別の関数として実装する事は出来るのでしょうか

イメージとしては下のような感じです

該当のソースコード

c++

1#include<bits/stdc++.h> 2 3template<class T>struct my_vector { 4 std::vector<T> V; 5 6 my_vector(int n = 0, int v = 0) : V(n, v) {} 7 8 //a 9 //値が代入される際に呼ばれる 10 int &operator[](int i) {/*処理*/} 11 12 //b 13 //上以外の場合に呼ばれる 14 const int operator[](int i) { /*処理*/} 15}; 16 17int main() { 18 my_vector<int> V(10, -1); 19 V[0] = 1; //aを呼ぶ 20 int v = V[0]; //bを呼ぶ 21 22 return 0; 23}

補足情報(FW/ツールのバージョンなど)

gcc, c++17

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

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

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

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

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

guest

回答2

0

ベストアンサー

(略)2行目と3行目の添え字演算子を別の関数として実装する事は出来るのでしょうか

C++言語の仕様上、直接的には実現不可能です。


どうしてもというのであれば、プロキシ(proxy)クラスを用意すれば分岐自体は可能です。個人的には、そもそものmy_vectorクラス設計を見直すことをお勧めします。
https://wandbox.org/permlink/J1VHjYdUY09YnJOI

C++

1template<class T> 2struct my_vector { 3 std::vector<T> V; 4 5 my_vector(int n = 0, int v = 0) : V(n, v) {} 6 7private: 8 struct proxy { 9 my_vector& vec; 10 int idx; 11 12 // a 代入構文v[i] = val 13 my_vector& operator=(T val) { 14 std::cout << "a\n"; 15 vec.V[idx] = val; 16 return vec; 17 } 18 19 // b 上記以外 20 operator int() const { 21 std::cout << "b\n"; 22 return vec.V[idx]; 23 } 24 }; 25 26public: 27 proxy operator[](int i) 28 { return {*this, i}; } 29};

投稿2020/04/17 14:19

yohhoy

総合スコア6191

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

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

baito

2020/04/17 15:17

なるほど!簡潔で考えていない方向からの実装だったため感動しました ありがとうございます ちなみにセグメントツリーのupdateとgetに使う予定でした
yohhoy

2020/04/18 07:29

このような実装は一種の「トリック」ですから、微妙なエッジケースで問題になったり不可解な動作不具合を引きこす可能性も否めません。 想定されているケースでは、操作対象に対して直接 update や get を行う自前関数を別途用意したほうがよいかもしれませんね。
guest

0

その 2つのメンバ関数は、返却値の型のみが異なるだけで引数は全く同じです。
引数が同じ関数は 2つ宣言することはできません。
次のようにすることによって 2つ宣言できるでしょう。

C++

1 int& operator[](int i) {/*処理*/} 2 int operator[](int i) const { /*処理*/}

投稿2020/04/17 13:50

kazuma-s

総合スコア8224

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

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

SHOMI

2020/04/17 13:59

この場合両方上が呼ばれますよね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問