Boost.Protoでベクトル型に一致する文法を作成しようとしていますが、その型の端末を指定すると、文法と一致しません。タイプ定義は次のようになります。
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];
};
一致させようとしている文法は次のようになります。
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>));
}
特定のタイプに一致する文法を作成するにはどうすればよいですか?
編集:
proto::_およびproto::Nは、カスタムタイプでワイルドカードとして使用されていないようです。コードはこの文法でコンパイルされます(matches
アサーションはパスします):
struct test:
proto::terminal<vector<float, 2> >
{};
ただし、ワイルドカードのいずれかが次のタイプの場合は機能しません。
struct test:
proto::terminal<vector<float, N> >
{};
または:
struct test:
proto::terminal<vector<_, 2> >
{};
したがって、自分のタイプのワイルドカードを使用できない場合、式がベクトルを含む端末であるかどうかをテストするにはどうすればよいですか?