1

私は今のところ C++03 で立ち往生しており、任意の数のタイプ セーフな引数を受け入れるグローバル関数を作成したいと考えています (必要に応じて、9 などの合理的な制限まで)。

私は自分のコード ベースで完全なブースト ライブラリにアクセスboost::mpl::vectorできるので、ここで役立つことを願っています。また、これを書くのが不便になりたくありません。呼び出しサイトの構文は、次のように単純にする必要があります。

LogDebugMessage("Number of cats and dogs:", m_myPets->NumCats(), m_myPets->NumDogs());

タイプセーフな方法でこれを実装する最良の方法は何でしょうか?

編集

また、これにはテンプレートの特殊化を使用できることも認識していますが、追加のテンプレート パラメーターごとに 1 つずつ、同じ構造体を 9 回定義することはしたくありません。これは面倒すぎます。できればそれは避けたいです。

4

1 に答える 1

1

最善の方法は、9 つ​​のオーバーロードです。:P

ただし、最も簡単な方法は、ほとんどコンパイル時のみであるため、boost::tupleを使用する代わりに使用することです。呼び出しサイト (ユーザー) は、次のように記述します。boost::mplmpl

LogDebugMessage("Number of cats and dogs:",
    boost::tie(m_myPets->NumCats(), m_myPets->NumDogs()));

tie参照のタプルを作成します。または、呼び出しに一時的なものが含まれる場合:

LogDebugMessage("Number of cats, dogs and birds:",
    boost::make_tuple(m_myPets->NumCats(), m_myPets->NumDogs(), 0));

ログに記録された型が少し重い (boost::make_tupleコピーを作成する) 場合は、古き良きに頼ることができますboost::ref

次にLogDebugMessage、次のようになります。

template<class Tuple>
void LogDebugMessage(std::string const& msg, Tuple const& args);

その後、タプルプリンターと同様の再帰を使用してタプルをアンパックします。operator<<実際には可変個引数テンプレートのみを使用し、単にピックアップするためだけに使用することに注意してくださいstd::tuple。ほとんどの場合、そのprint_tuple部分のみを使用します。

于 2012-03-07T21:10:50.400 に答える