• ベストアンサー

関数名、パラメータは同じで、戻り値によって異なる処理?

戻り値というより、受け側によって関数の振る舞いを変えたいのですが、 C++では、同名、同パラメータはC2556のコンパイルエラーになります。 Perlでいうリスト値を返すかスカラー値を返すかは呼び出し側によるようなことをしたいのですが、C++では無理でしょうか? 下の例では、//...部分は戻り値によって異なるのでC++のテンプレート?では無理そうですが、そんなことはC++でできるのでしょうか? 似たようなテクニックでも構いませんので、知識の豊富な方、教えてください。 #include <iostream> #include <string> using namespace std; class A { public: A(){} ~A(){} int test(int x, int y){           //... return 0; } string test(int x, int y){ // ... return ""; } }; void main(void){ A a; int ret1 = a.test(1,2); string ret2 = a.test(1,2); cout << endl << "End..." << endl; }

質問者が選んだベストアンサー

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.4

決してお勧めはしませんが... class A { public:  class B  {   A* a_;   int x_, y_;  public:   explicit B(A* a, int x, int y) : a_(a), x_(x), y_(y) {}   template <class T>    operator T() const;  };  B test(int x, int y)  {   return B(this, x, y);  } }; template<> A::B::operator int() const { return 0; } template<> A::B::operator std::string() const { return ""; } int main() {  A a;  int i = a.test(1, 2);  std::string s = a.test(1, 2); } とすれば解決できそうです。GCCではコンパイルできました。 (移植性があるかどうかは未確認)

その他の回答 (3)

回答No.3

お勧めできるかどうかは別として、見かけが、普通の関数に見える方法としては、zwi さんのお書きになっている2)を準用すると。 class func() { public: func(int a, int b) { // コンストラクタ // ここで初期的に必要な処理 } operator int() { // 返値が int の場合(実際には、int への型変換関数) return 0; } operator string() { // 同じく string 用 return ""; } }; 等とできます。 これで、 int ret1 = func(1,2); string ret2 = func(1,2); は、ちゃんと、それなりの動きをします。 動作としては、返値の型を変えているのではなくて、func というクラスのインスタンスを生成して、それを、int なり string に型変換したというものです。

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.2

普通に考えて int test(int, int) std::string test(int, int) の両方が定義できてしまうと、 ret1 = a.test(1, 2); が「正当な」代入であるか判断できませんよね。 ret1 = a.test<std::string>(1, 2); とできるように template<typename T> T test(int, int) { ... } とするとか?

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.1

方法は3つですかね。 (1)戻り値は諦めて、パラメータ参照渡しにして関数自身をオーバーロードする。 (2)関数の結果を直接返さずに、クラス内に保持させて別関数で返すか、型変換のオーバーロードを使用する。 (3)完全にコンパイラをだます方法としては、パラメータが違えばオーバーロードできるので、ダミーのパラメータを片方につける。 って(3)は、だまし討ちなのでお勧めしませんが。

関連するQ&A

  • 構造体ポインタ、及び、戻り値のあるマクロ関数の作成方法について

    ●開発環境 [OS] Linux 2.6.9 [コンパイラ] GCC 3.4.6 ●質問 以下のプログラム中のTEST関数を、 マクロ関数(#define)にしたいのですが、 やり方がわかりません。 ご存知の方がいらっしゃいましたら、ご教授願います。 -------------------------------- #include <stdio.h> typedef struct t_str_abc { unsigned int x; unsigned int y; } str_abc; unsigned int TEST( str_abc *kou ); void main(void) { str_abc kouzou; unsigned int ret; kouzou.x = 1; kouzou.y = 2; ret = TEST(&kouzou); printf("ret = %d\n", ret); } unsigned int TEST( str_abc *kou ) { unsigned int state; state = kou->x + kou->y; return state; } --------------------------------

  • 関数の戻り値に関数のアドレスを返すできませんか?

    戻り値に関数のアドレスを与える方法が良く分かりません. ひとまず,以下のように動くプログラムを作りたいと思っています.  f2(1,2)(1); //このように引数の()を二種類に分けたいのですが 無理でしょうか?? プログラムは下のように作って実験しているのですが良く分かりません・・ どなたか分かる方居たら教えてください. int f1(int x , int y){ return 0; } ????? int ff(int x){ return f; };

  • C言語の関数の質問です

    C言語の質問です 最近C言語を始めました。以下の問題がわかりません。 int型の数値を入力して結果をdouble型の戻り値を返すことはできないのか。 関数の値のやり取りでも暗黙の型変換や明示的な型変換はできるのか。 #include <stdio.h> double square(int x); int main(void) { int num;   double ret;   scanf("%d",num); ret = square(num);    printf("%ld",ret); return(0); } double square(int x){ return(x*x); }

  • 配列を関数の戻り値にする

    こんにちは、質問があります。 ラベルに関数の戻り値を表示させたいのですが うまくいきません。 良い解決方法ご存知の方いらっしゃいませんか? よろしくお願いします。 ============================================================== import java.awt.*; import javax.swing.*; class Set { int hairetsu[]=new int[3]; int[] dainyuu() { hairetsu[0]=100; hairetsu[1]=200; hairetsu[2]=300; return hairetsu; } } class return_test { String tensuu[]; public static void main(String[] args) { JFrame frame=new JFrame("確認"); JPanel panel=new JPanel(); Set ret=new Set(); tensuu=ret.dainyuu(); JLabel label=new JLabel(tensuu); panel.add(label); Container ct=frame.getContentPane(); ct.add(panel); frame.setVisible(true); frame.pack(); } }

    • ベストアンサー
    • Java
  • 戻り値について

    ただ今、c言語の勉強をしている者です。 本を読んでいて分からないところがあったので ご指導して頂ければと書き込みました。 それは、最初と最後のところです。 int main(void) { ・ ・ 処理 ・ ・ return 0; >int main(void) このintというのは 戻り値が整数だと言うことだと思うのですが 戻り値が文字の場合ということも あるということですか? 例えば、 char main(void) ということもあるのでしょうか? また、voidというのは 他の名前にしたらいけないのでしょうか? > return 0; というのは、 正常に終わったら戻り値を0にしろということですか? ご指導して頂ければと思います

  • C++の複数戻り値について

    質問の閲覧ありがとうございます。 C++をはじめたばかりで勉強中のみなのですが どうしてもうまくいかない壁にぶつかってしまったので 是非お力を貸していただきたく、質問させていただきました。 C++にて課題を出されていまして、それを実現するのに ある関数に対し引数を複数渡し、戻り値を複数得たいのですが 下記のようなコードで、(実際は戻り値、引数がもっと多くなる 想定なのでreturnでは足りないです) 単純に、mainのa2の引数を"参照渡し"としtestにて代入した文字列を mainで再度受け取る、といったことを試しているのですが、うまくいかず このような形では実現不可能なのでしょうか? (文字列の代入をstrcpyに、charの宣言時に要素数を指定したりせずに) #include<iostream> using namespace std; void test(char* a2); int main() { char a2; test(&a2); cout << a2 << endl; } void test(char* a2) { a2="TEST_MESSEAGE1"; } 素人丸出しな内容で申し訳ないですが、ネット上の色々なサンプル等 で試してみても、理解がうまく得られませんでした。。。 ポインタ等の理解が浅いのもあるのかと思いますが。 ぜひご教授よろしくお願いいたします。

  • 下記、プログラム内の「char *」の役割

    C++初心者です。 縦長になってしまいますが、 『 #include <iostream.h> void show(int); void show(double); void show(char *);   ←左記の記述の使い方 int main(void) { show(1); show(0.25); show("文字列"); return 0; } void show(int x) { cout << x << endl; } void show(double y) { cout << y << endl; } void show(char *z) { cout << z << endl; } 』 のプログラムにおいて、「char *」の使い方がいまいち理解できません。 上記プログラムですとエラーが表示されないのですが、下記のプログラムだとエラーが発生します。 『 #include <iostream.h> void show(int); void show(double); void show(char);   //←---------上記と違う行 int main(void) { show(1); show(0.25); show("文字列"); return 0; } void show(int x) { cout << x << endl; } void show(double y) { cout << y << endl; } void show(char z) {  //←---------上記と違う行 cout << z << endl; } 』 なぜ、ポインタ(*)を付けないといけないのか分かりやすく教えていただけましょうか。

  • 戻り値を返す関数の前に(void)を付ける

    今日会社で 変数 = (void)戻り値のある関数 #具体的な例としては下記一例を参照 と、ソースで書かれているものがあったのですが、 コメント等では、 「戻り値を明示しないときに(void)を付けて使用する」 と、書いてあります。 戻り値のある関数の前で(void)を付けると、戻り値が明示されなくなるのでしょうか?? または、このような動作にはならないのでしょうか。 自分自身、ソースの内容をうる覚えになっておりますので、 確認をしながらアップしていきたいと思いますので、 宜しくお願い致します。 /*一例*/ ・num1とnum2を足した値を返す int PlusPoint(int num1 , num2); ・PlusPointの値を格納する int Sum ◇ソース◆ #include <stdio.h> #include "Plus.h" int main(void) { int Sum; Sum = (void)PlusPoint; if(Sum == 2) { printf("false"); exit(0); } printf("true"); return 0; } *PlusPoint関数は外部で定義されている *プロトタイプ宣言はPlus.hに定義されいるものとする

  • new型の戻り値? new型のパラメータ?

    あらゆる応用が利くC++ではあるのですが、それによってひとつのやり方にも複数の方法が出てくるのはよくあること。そこで、new型のポインタにおいて戻り値として返せばいいのか、パラメータとして使えばいいのか悩んでおります。 [1] wchar_t *XXX(int size){   wchar_t *ret = new wchar_t[size]   //ポインタに対するいろいろな制御   return ret; } ↑このように、関数内部でnew型ポインタを宣言し、そのポインタのアドレスを外部のポインタに渡す。 [2] static wchar_t ret = new wchar_t; -------- void XXX(wchar_t *ret, int size){   //ポインタに対するいろいろな制御 } ↑関数を呼ぶ手前ですでにnew型ポインタを宣言しておく [1]のほうが、宣言をする手間を省くことができるような気がしますが、new型ポインタがいらなくなったときにdeleteするのをわすれてしまったりということが起きるかもしれないということも考えてしまい、どちらをがメジャーなのかよくわかりません。 皆様ならどういった方法をとりますか? また別な方法がありましたが教えてくださるとありがたいです。

  • 関数の戻り値なんですが...

    VC++を使用し以下のような関数additionで文字列を返したいのですが アドレスしか返しません。配列はその先頭のポインタだということは しっているのですが.... additionは、二つの文字列(32や47などの数字のやつ)を引数とし、そ れを整数型に変換し、その加算を行い、その結果を文字列型に変換し 、その文字列をかえす関数です。 関数の定義などが間違っているのですか?? #include<iostream.h> #include<string.h> #include<string> char *addition(char *,char *); void main(){ using namespace std; char a[] = "1000"; char b[] = "456"; cout << addition(a,b) << '\n'; } char *addition(char *a,char *b){ int c = 0; c = atoi(a)+atoi(b); char p[20]; _itoa(c,p,10); cout << p <<'\n'; return (*p); }

専門家に質問してみよう