Joel Falcou wrote:
Hello,
i have a DSL where terminal are defined like : terminal< simdproto::_ > What I want is that any binary operator that apply on those terminal should be available only if both lhs and rhs parts have the same underlying type. E.G :
simd<float> + simd<float> is ok while (simd<char> + simd<char>)*simd<float> is not ok.
How I can enforce this check ? Is having a transform that take an expression and returns the underlying type OR mpl::void_ if an error occurs the good solution ?
This question has come up a couple of times. The solution isn't very pretty ... write a grammar that allows expressions with incompatible terminals, and then write a separate transform that checks the terminals for compatibility. This issue came up during Proto's review and I posted some example code here (see the SameTerminals transform): http://lists.boost.org/Archives/boost/2008/03/135169.php I wish I knew of a better solution. -- Eric Niebler BoostPro Computing http://www.boostpro.com