質問編集履歴

2 誤字修正

DaiGuard

DaiGuard score 123

2017/11/15 20:47  投稿

#defineでメンバ関数のような名前の関数を定義したい
###前提・実現したいこと
現在、C/C++でプログラムのログやメッセージを標準出力するクラスを作成しています。
その出力に実行したソースコード名、行数を表示したく、以下のようなソースを書いています
今のやり方だとせっかく出力用の関数をAppMonitorクラスにまとめているのに
msg()としてしか呼び出すことができない。
これをAppMonitor::msg()のようなメンバ関数のように呼び出したい
見た目だけの問題なんですが、
知見をいただけないでしょうか?
※追記
#defineで定義することにこだわっていません。
defineで定義することにこだわっていません。
AppMonitor::msg()を呼び出すだけで、呼び出し先の
__FILE__と__LINE__を受け取れる方法が知りたいです。
```
/* msg()を実行した先のファイル名と行数を追記する定義 */
#define msg(format, ...) AppMonitor::message(format, __FILE__, __LINE__, __VA_ARGS__)
/* 実際に作りたい定義 */
// #define AppMonitor::msg(format, ...) AppMonitor::message(format, __FILE__, __FILE__, __VA_ARGS__)
/* プログラムの標準出力をまとめるクラス */
class AppMonitor{
   /* メッセージを出力するメンバ関数 */
   template<typename... Rest>   // 可変長引数のためのテンプレート
   static void message(const char* format,   // printf用のフォーマット文字列
                       const char* file,     // msg()からもらうファイル名
                       const int line,       // msg()からもらう行数
                       const Rest&... rest){ // 可変長引数
       /* printf用フォーマットとファイル名,行数を合わせる*/
       std::string str = std::string(file) + " "
                       + std::to_string(line) + " "
                       + std::string(format);
       /* printfで出力 */
       printf(str.c_str(), rest...);
   }
}
```
###補足情報(言語/FW/ツール等のバージョンなど)
開発環境はUbuntu 16.04, コンパイラはgcc 5.4.0
C++11を使用しています
  • C++

    8247 questions

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

  • C

    8729 questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

1 質問の意図が伝わっていないようなので追記

DaiGuard

DaiGuard score 123

2017/11/15 20:45  投稿

#defineでメンバ関数のような名前の関数を定義したい
###前提・実現したいこと
現在、C/C++でプログラムのログやメッセージを標準出力するクラスを作成しています。
その出力に実行したソースコード名、行数を表示したく、以下のようなソースを書いています
今のやり方だとせっかく出力用の関数をAppMonitorクラスにまとめているのに
msg()としてしか呼び出すことができない。
これをAppMonitor::msg()のようなメンバ関数のように呼び出したい
見た目だけの問題なんですが、
知見をいただけないでしょうか?
 
※追記  
#defineで定義することにこだわっていません。  
AppMonitor::msg()を呼び出すだけで、呼び出し先の  
__FILE__と__LINE__を受け取れる方法が知りたいです。  
```
/* msg()を実行した先のファイル名と行数を追記する定義 */
#define msg(format, ...) AppMonitor::message(format, __FILE__, __LINE__, __VA_ARGS__)
/* 実際に作りたい定義 */
// #define AppMonitor::msg(format, ...) AppMonitor::message(format, __FILE__, __FILE__, __VA_ARGS__)
/* プログラムの標準出力をまとめるクラス */
class AppMonitor{
   /* メッセージを出力するメンバ関数 */
   template<typename... Rest>   // 可変長引数のためのテンプレート
   static void message(const char* format,   // printf用のフォーマット文字列
                       const char* file,     // msg()からもらうファイル名
                       const int line,       // msg()からもらう行数
                       const Rest&... rest){ // 可変長引数
       /* printf用フォーマットとファイル名,行数を合わせる*/
       std::string str = std::string(file) + " "
                       + std::to_string(line) + " "
                       + std::string(format);
       /* printfで出力 */
       printf(str.c_str(), rest...);
   }
}
```
###補足情報(言語/FW/ツール等のバージョンなど)
開発環境はUbuntu 16.04, コンパイラはgcc 5.4.0
C++11を使用しています
  • C++

    8247 questions

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

  • C

    8729 questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る