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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

C++

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

Qt Creator

Qt Creatorは、Qtアプリケーションを開発するための開発統合環境(IDE)です。

Q&A

解決済

6回答

2842閲覧

呼び出すたびに、交互に処理をする関数の実装方法

tuyudaku

総合スコア75

Qt

QtはGUIプログラムの開発で広く使われているクロスプラットフォーム開発のフレームワークです。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

C++

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

Qt Creator

Qt Creatorは、Qtアプリケーションを開発するための開発統合環境(IDE)です。

0グッド

0クリップ

投稿2019/07/02 12:02

編集2019/07/03 00:27

実装方法に悩んでいるので助言をお願いしたいです。

引数で処理を分ける関数があるとします

C++

1func(int tmp) 2{ 3 if(0 == tmp) 4 { 5 printf("A\n"); 6 } 7 else 8 { 9 printf("B\n"); 10 } 11}

この二つの関数を、ある一つの関数を呼び出すだけで呼び出すたびに交互に処理をする関数を作成したいと思っています。

c++

1func_call_AorB 2{ 3 // 前回がfunc(1)ならfunc(0)を実行 4 // 前回がfunc(0)ならfunc(1)を実行 5}

func(0)とfunc(1)を使うかどうかの設定値も持っており
それによっても処理を分岐しなくてはなりません、片方が使用しない設定なら
片方の関数を呼び続けるようにしたいです。
両方の設定がfalseになることはありません、また設定値は途中で変わることはありません

C++

1func_call_AorB 2{ 3 if(true == use_0) 4 { 5 // 前回の実行がfunc(1)か、func(1)を使わない設定ならfunc(0)を実行 6 } 7 if(true == use_1) 8 { 9 // 前回の実行がfunc(0)か、func(0)を使わない設定ならfunc(1)を実行 10 } 11}

フラグを複数使ってごり押しのコードを書けば実現できそうなのですが
できるだけスマートに書けないかと思い質問させていただきました

よろしくお願いいたします

※質問が間違っていたため修正しました

###追記
シンプルに文章が長くなりすぎないようにと考えて質問した結果
本来やりたい事から離れてた上に、回答者さんにも混乱をあたえてしまうことになってしまったことをお詫びします。
皆様回答ありがとうございました

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

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

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

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

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

yuba

2019/07/02 12:19

「funcAとfuncBを使うかどうかの設定値」データはどこにどんな形で保持されていて、それは途中で変わってしまう可能性があるものでしょうか。 また、複数のスレッドが func_call_AorB を呼び出すことは想定されているのでしょうか。 また、そもそもそんなことをしたい目的はどんなものなのでしょうか。
episteme

2019/07/02 12:32

で、初回はどーすんの?
guest

回答6

0

イメージになりますが、こんなのはどうでしょうか。

c++

1 2int get_func_param() { 3 if (/*0も1も使えない*/) return null; 4 if (/*初回or前回が1かつ0が使える*/) return 0; 5 if (/*前回が0かつ1が使える*/) return 1; 6 return null; 7} 8 9func(get_func_param());

投稿2019/07/02 14:23

takasima20

総合スコア7458

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

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

0

ある一つの関数を呼び出すだけで呼び出すたびに交互に処理をする

これだけなら、

C++

1void func(){ 2 static bool sel = false; 3 if(sel){ 4 printf("B\n"); 5 }else{ 6 printf("A\n"); 7 } 8 sel = sel ^ true; //exorで反転 9}

あたりで十分な気はしますがしかし

func(0)とfunc(1)を使うかどうか

さらに

片方が使用しない設定なら片方の関数を呼び続けるようにしたい

この三つの機能を一つの関数に持たせて引数で切り替えよう、という事に無理があると思います。

C++

1void func0(){ 2 printf("A\n"); 3} 4void func1() 5{ 6 printf("B\n"); 7} 8enum Mode 9{ 10 FLIP, 11 HOLD, 12 FUNC0, 13 FUNC1 14}; 15 16void func(Mode md) 17{ 18 static bool sel = false; 19 swich(md){ 20 case FLIP: 21 sel = sel ^ 1; 22 break; 23 case HOLD: 24 break; 25 case FUNC0: 26 sel = true; 27 break; 28 case FUNC1: 29 sel = false; 30 break; 31 } 32 if (sel) 33 { 34 func0(); 35 } 36 else 37 { 38 func1(); 39 } 40}

とか。う~ん、ムリヤリ感満載ですね。

投稿2019/07/02 13:44

thkana

総合スコア7639

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

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

tuyudaku

2019/07/03 00:22

>この三つの機能を一つの関数に持たせて引数で切り替えよう、という事に無理があると思います やはり無理やり感は出てしまいますよね... C++をしっかりと活用したことが無いため、私の知らない標準ライブラリで とても便利なものがあるのでは...!? とも期待していたのですが、そうあまくは無いですねw FLIP、HOLDの考え方はとても参考になりました 作成中のプログラムでも活かせそうな気がするので勉強になりました! 回答ありがとうございました
guest

0

C++

1func_call_AorB(){ 2 static int aorb=0; 3 if(use_0 && use_1){ 4 aorb = 1 - arob; 5 func(arob); 6 }else{ 7 func(use_1); 8 } 9}

ですかね。aorbboolにするのもあり。

投稿2019/07/02 13:13

otn

総合スコア84529

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

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

otn

2019/07/02 14:33

use_0とuse_1の、 ・どっちも真なら、交互に呼び出す。 ・片方しか真でないなら、真の方の値で呼び出す(trueが1であることを利用)。
otn

2019/07/02 14:36

use_0やuse_1がboolでなくて0と1以外の値を取り得るなら、func(use_1)じゃなくて、func(!use_0)ですかね。こっちの方が良かったか。
tuyudaku

2019/07/03 00:19

なるほど... 人によって考え付く実装方法がいろいろありとても勉強になります こんな分かりにくい質問で回答していただきありがたいです 今回の質問は質問をシンプルにしすぎて 本来やりたいこととはかけ離れてしまったことに気付いたため また別の質問をしたいと思います。見かけた際はよろしくお願いいたします 回答ありがとうございました
guest

0

ベストアンサー

関数オブジェクトを切り替える方法はどうでしょう。

C++

1#include <functional> 2#include <iostream> 3 4void funcA(void); 5void funcB(void); 6 7namespace { 8 bool useFuncA = true; 9 bool useFuncB = true; 10 std::function<void(void)> func = funcA; 11} 12 13void funcA(void) { 14 std::cout << "funcA\n"; 15 if(useFuncB) func = funcB; 16} 17void funcB(void) { 18 std::cout << "funcB\n"; 19 if(useFuncA) func = funcA; 20}

すみません、根本的に私の質問が間違っていて

違う関数ではなく同じ関数で実引数を交互に変えるというものでした..

スマートかは分かりませんが、一つの案として。ほぼ変わってないですね。

C++

1#include <iostream> 2#include <functional> 3#include <string> 4 5void funcA(void); 6void funcB(void); 7 8namespace { 9 bool useParamA = true; 10 bool useParamB = true; 11 std::function<void(void)> func = funcA; 12} 13 14void funcImpl(const std::string& arg) { 15 std::cout << arg << "\n"; 16} 17void funcA(void) { 18 funcImpl("A"); 19 if(useParamB) func = funcB; 20} 21void funcB(void) { 22 funcImpl("B"); 23 if(useParamA) func = funcA; 24}

投稿2019/07/02 12:17

編集2019/07/02 12:50
LouiS0616

総合スコア35660

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

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

tuyudaku

2019/07/02 12:24

>関数オブジェクトを切り替える方法はどうでしょう おぉ...なるほど!! と思ったのですが すみません、根本的に私の質問が間違っていて 違う関数ではなく同じ関数で実引数を交互に変えるというものでした.. 本当に申し訳ないです 質問を修正します... 回答ありがとうございました!
guest

0

そんなに入り組んだ話でもないようですし,
func()に渡すべき引数を要素数2の配列で持ってしまうのが楽かと思います.

下記★記載の設定初期化方法を適切に用意する必要があります.
(いつ設定が決定されるのかわからないですが)

  • {0,0} あるいは {1,1} に設定すれば,一方だけがずっと続く(片方を禁止する)
  • {0,1} あるいは {1,0} に設定すれば「交互」になる
namespace { int arg_for_func[2] = { 0, 1 }; //←★この配列の内容を初期化する手段を適切に設ける int next_index_of_arg_for_func = 0; //←必要であれば,こいつを0に初期化する手段もあると良いかも } //呼び出す毎に //func()の引数が変わる関数 void TheFunction() { //func()の呼び出し func( arg_for_func[ next_index_of_arg_for_func ] ); next_index_of_arg_for_func = ( next_index_of_arg_for_func + 1 )%2; }

投稿2019/07/03 03:11

fana

総合スコア11656

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

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

0

そりゃ同じ関数を呼び出して、その中で交互に関数を呼び出せばいいはなしになりますが、
そんでいいのかな?

そもそもの、あなたのやりたいことがなになのか、を聞いてくれるほうがいいかとおもいますが。

投稿2019/07/02 12:26

y_waiwai

総合スコア87774

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

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

tuyudaku

2019/07/02 12:33

たしかに、できるだけシンプルに質問しようとしすぎて 逆に分かりにくくなってしまっていますね... ただ、根本的にやりたいことを明確に書くと少し長くなりそうで困っております... もう少し文章を練り直して見ます 回答ありがとうございました
y_waiwai

2019/07/02 12:36

まあ、やりたいことが言えないというならそんだけのはなしですわな。 他人に聞く段階ではないということで。 まあ、ご自分で頑張ってください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問