戻り値というより、受け側によって関数の振る舞いを変えたいのですが、
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;
}
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ではコンパイルできました。
(移植性があるかどうかは未確認)
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 に型変換したというものです。
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) {
...
}
とするとか?
No.1
- 回答日時:
方法は3つですかね。
(1)戻り値は諦めて、パラメータ参照渡しにして関数自身をオーバーロードする。
(2)関数の結果を直接返さずに、クラス内に保持させて別関数で返すか、型変換のオーバーロードを使用する。
(3)完全にコンパイラをだます方法としては、パラメータが違えばオーバーロードできるので、ダミーのパラメータを片方につける。
って(3)は、だまし討ちなのでお勧めしませんが。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
if と配列の組み合わせ
-
シグマ公式・・・C言語
-
C言語での引数の省略方法
-
std::set<int> で、ある値が何...
-
単語の出現回数を数え、出現回...
-
比較回数と交換回数表示について
-
double型の値を、一桁ずつint型...
-
Cでボリュームコントロールを制...
-
C言語での奇数の和
-
関数について
-
c言語 〇×ゲーム
-
因数分解を行うプログラムについて
-
数字列を3桁ごとにカンマで区切...
-
アスタリスクで正方形
-
関数のコピー
-
ラップ関数とはどんなものですか?
-
剰余演算を論理演算と加減算に...
-
ColorをRGBで指定する方法
-
ゴールドバッハの予想のプログラム
-
VB6.0でコンピュータ名の取得
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
#define _CRT_SECURE_NO_WARNIN...
-
AtCoderABC135の問題Cについて
-
C言語 エラーの原因がわからな...
-
複数桁10進数の*桁目だけを抽出...
-
【C++】関数ポインタの使い方
-
実数の整数部,小数部の取得
-
ラップ関数とはどんなものですか?
-
if と配列の組み合わせ
-
return 1L
-
read関数をノンブロッキングで...
-
(int *)の意味
-
std::set<int> で、ある値が何...
-
Win32APIで作るコンボボックス...
-
C++でvectorにテキストファイル...
-
「{ } で囲むだけ」は正しい?
-
足して100になるような乱数のア...
-
Arduinoのプログラムにエラーが...
-
課題でつまってます・・・
おすすめ情報