2

Karma 生成機能を使用して、sprintf のような機能で double を char に変換し始めています。そのために、次の例を使用しています。

template <typename T>
class  double3_policy : public boost::spirit::karma::real_policies<T>   
{
public:
template <typename T>
static unsigned int precision(T) 
   {

      return 3; 
  }
};

typedef boost::spirit::karma::real_generator<double,  double3_policy<double> >  double3_type;

double3_type const double3 ;

using boost::spirit::karma::left_align;
using boost::spirit::karma::generate;

char *p = buffer;
generate(p, '[' << left_align(14)[double3] << left_align(14)[double3] << ']', 12345.000, 22/7.0);
*p = '\0';

この例は正常に動作しますが、精度メソッドは静的であり、その値を動的に設定する方法がわかりませんでした。使用ごとに精度を指定し、実行時に変更したいと考えています。定義された数の精度が必要なので、最初にすべてのジェネレーターを作成してもかまいません。

問題は、それらの唯一の違いが返される数値である場合、各精度数値のクラスを作成する必要があるとは思わないことです。メンバー メソッドを使用してクラスをコンパイルしようとしました (これが私にとって十分なメンバー精度メソッドである場合)。このクラス メソッドの問題で立ち往生していると思います。

精度の異なるジェネレーター オブジェクトを作成し、複数のクラスを作成せずにそれらを使用するにはどうすればよいですか? ジェネレーターを 1 つだけ使用できる場合は、プロパティを変更するだけでさらに良くなります。

誰かが同じ問題を抱えていて、解決策を共有できる場合は非常に役立ちます.

ありがとう、

4

1 に答える 1

1

Karma ジェネレーターは、埋め込まれた DSLのような (コンパイル時!) 式テンプレートを使用して文法を指定することがすべてです。

これは確かに、動的なフォーマット仕様には適用できません。

使用することをお勧めします

Karma でこの動作を確認できる唯一の方法は、精度を追加の引数として受け取るリアル印刷用のカスタム ディレクティブを作成することです。それだけの価値はありません (そして、ここで Karma を使用することで得られた唯一の利点であるパフォーマンスが失われます)。

于 2015-09-28T21:11:25.497 に答える