動的デフォルト引数で何か面白いことできないかな、と思って作ってみました。
github
ideone
#include <iostream>
#include "arggregate.hpp"
// 集計カテゴリの定義(現状は行ごとにカテゴリ化される。)
typedef ::arggregate::ArggregateCategory(test) Arggregate1;
typedef ::arggregate::ArggregateCategory(test) Arggregate2;
typedef ::arggregate::Min<int, ::arggregate::Max<int> > MinMax;
void f1(Arggregate1::Decl< int, ::arggregate::Min<int> >::Type x=Arggregate1::Value< int, ::arggregate::Min<int> >(1000) )
{
if( x.is_default() ) ::std::cout << x << ::std::endl;
}
void f2(Arggregate2::Decl< int, MinMax >::Type x1=Arggregate2::Value< int, ::arggregate::Min<int> >(-1)
, Arggregate2::Decl< int, MinMax >::Type x2=Arggregate2::Value< int, ::arggregate::Max<int> >(1000) )
{
::std::cout << x1 << ":" << x2 << ::std::endl;
}
int main(void)
{
{
::std::cout << "----- f1 ----- " << ::std::endl;
f1(); // 集計情報 0 のため 通常デフォルト引数が渡される
for( int i=10; i > 0; --i )
{
f1(i); // 通常使用
}
f1(); // 集計した結果の最小値がデフォルト引数となる
}
{
::std::cout << "----- f2 ----- " << ::std::endl;
f2(); // 集計情報 0 のため 通常デフォルト引数が渡される
for( int i=10; i > 0; --i )
{
f2(i); // 第一引数のみ指定、第二引数にも集計結果が反映される
}
f2(); // 集計した結果の最小、最大値がデフォルト引数となる
}
return 0;
}

カテゴリ
typedef ::arggregate::ArggregateCategory(test) Arggregate1;カテゴリの定義をします。こちらのカテゴリごとに情報が集計されます。
現時点では、__LINE__ ごとにカテゴリが分けられます。
(※とりあえずの実装です。将来的に変更する予定です。)
引数の型
Arggregate1::Decl< int, ::arggregate::Min<int> >::Type集計用の引数の型です。
Decl template の1つ目に本来の型を指定します。
2つ目に集計を行うクラスを指定します。
上の例では、Min と Min, Max を組み合わせた MinMax を使用しています。
(※現時点では、Min,Max のみです。今後増やす予定)
デフォルト引数の値
Arggregate1::Value< int, ::arggregate::Min<int> >(1000)デフォルト引数の値を指定します。
2つ目の template に指定するのは単一の集計クラスです。(Min と Max を同時指定はできない)
Min の場合、今までに渡された値の最小値をデフォルト引数として使用します。
Value 関数の引数には、デフォルトのデフォルト引数の値を指定します。
サンプリングされた値がない場合に、使用されます。
0 件のコメント:
コメントを投稿