| |||
| 我要写这样一个Trait. 代码:
我希望我的Invoker可以察觉这个constness,如果T::apply期望B&,而传入invoke()的正好是一个const,我做一个拷贝。 就这样: B tmp ;T::apply(a,b); 如果知道T::apply是一个非模板的函数,并且没有overload,那么,我可以用函数指针&T::apply,然后用经典的sizeof的trick来找到B是const还是什么。 但是问题是T::apply可能是一个模板函数,它可能是: 代码:
代码:
|
| |||
| ajoo,你改一下apply,你原来是tempalte function,现在改成template functor,在里面typename 一下,比如这样 class T1 { template<typename A,typename B> struct apply1 { typename A lhs; typename const B rhs; void operator()(A,const B); }; apply1 apply; }; class T2 { template<typename A,typename B> struct apply1 { typename A lhs; typename B rhs; void operator()(A, B); }; apply1 apply; }; 这样你的能判断T中的apply的参数是const B还是B |
| |||
| 引用:
type_traits<M>::method_result::is_callable_with_arglist<cons<U,nil> >::value 这个模版大概又要依靠type_traits<U>。 说穿了就是编译期的concept checking框架,不同的是我们需要把checking的结果作为常量,而不是编译错误,所以必须完全用编译期结构。也就是说,要做完备的话,需要把全部的类型信息和推导规则都用meta-programming实现,然后每个函数描述自己的requirement(只需与编译相关的部分)。 完全不现实,just kidding ![]() |
| |||
| ajoo说的catch compile exception,对编译器可是一个大挑战,作者们从没想过需要从错误中恢复吧。C++ meta-programming本来就是meta-programme和programme混在一起,够头大的,现在又把编译过程这一层混进来...所以我想的是用type traits自己实现编译器的一部分,每个函数用这个语言表达特定调用能编译的条件,这样至少层次上挺清晰的。 还有个办法,把有多种选择的地方都标上预处理符号,用一个driver反复调用编译器来搜索能使程序编译通过的组合 ![]() |
| |||
| 解释一下我期望的框架: 用户实现一个rule: 它可以接受任意的Multiverse类型,因此不需要虚函数. 如果用户需要改变Universe的,就这样 代码:
代码:
代码:
我要求能够改变Universe.如果你不在乎我改变它,你就直接把你的Universe给我.如果你不希望我改变它,你就做一个拷贝再传给我. const Universe&对caller说: 我保证不改变你的Universe,你把它直接给我就是. U&是对caller说: 我自己不改变Universe,但是如果你给我的M要改变它,我就没办法了. 对于caller来说,如果它有一个Universe对象,要传给某一个rule,但是还有其它分支等待执行,就不能允许现在这个分支改变这个Universe对象. 而如果没有其它分支了,只是顺序执行,那么我就不在乎你是否改变我的universe对象,反正我也用不着它了. 在我的处理分支的代码里是这样: 代码:
所以,我不能允许P::apply改变U的状态,而对Q我就不在乎了. 在tianxing wang的原来那篇文章里,是直接通过做拷贝来处理的: 代码:
而这种不需要改变的情况是很常见的,比如: 代码:
代码:
|