Boost.Protoでベクトル型と一致する文法を作ろうとしていますが、その型の端末に文法に合っていません。タイプ定義は次のようになります。マッチが失敗Boost.Proto文法を型にマッチする
namespace proto = boost::proto;
using proto::_;
using proto::N;
struct test:
proto::terminal<vector<_, N> >
{};
:
int main()
{
BOOST_MPL_ASSERT((proto::matches<proto::terminal<vector<float, 2> >::type, test>));
}
私はどのように
template <typename T, unsigned D>
struct vector
{
typedef T scalar;
enum { size = D };
scalar& operator[](unsigned i)
{
return m_components[i];
}
scalar const& operator[](unsigned i) const
{
return m_components[i];
}
private:
scalar m_components[size];
};
私が一致する取得しようとしている文法は次のようになります特定のタイプに一致する文法を作ってください。
EDIT:
それはそのプロト:: _表示され、プロト:: Nは、カスタムタイプではワイルドカードとして使用されていません。コードはこの文法(matches
主張が通る)でコンパイルん:
struct test:
proto::terminal<vector<float, 2> >
{};
しかし、ワイルドカードのいずれかをタイプしているときは動作しません:
struct test:
proto::terminal<vector<float, N> >
{};
または:
struct test:
proto::terminal<vector<_, 2> >
{};
自分の型をワイルドカードで表現できない場合、式がベクターを含むターミナルであるかどうかをテストするにはどうすればよいですか?
カスタムのマルチDアレイクラスで同じものを試そうとしています。 protoを私のクラスに、または私のクラスをprotoに適合させる方が良いかどうか分かります。私はすでに働いていることの多くを台無しにしたくないので、私は最初の道を辿ることを試みているが、私は確信していない – Giuliano