喜欢(presudocode)
wrap<set(1..10)> (multiply,2) (divIDe,3) (plus,5) (inverse) (collect first 10) .unwrap()
除最后一行之外的所有行都输出一些东西.现在似乎意味着更少,但我相信我们可以在其上应用有趣的东西,如:
wrap<someClass> dat;dat.splitIntoThreads(2) (thingA) .clone() (thingB) (thing1) (thingC) (thing2) (thingD) (thing3) .nothing() (thing4) .sync() .exit() .addMerge()
这是我的包装代码:
template<class T>struct wrap{ wrap(){} wrap(T b){a=b;} template<class L,class...R> L operator() (L(T::*f)(R...),R...r){ return a.f(r...); } T a;};int main(){ wrap<testClass> a; a(&testClass::f,13,'a');}
它正在工作(gcc,c 0x).但是当我用以下内容替换第6,7行时(实际包装结果)
wrap<L> operator() (L(T::*f)(R...),R...r){ return wrap<L>(a.f(r...));
编译器只是sais:创建指向非类型“int”的成员函数的指针.
我怎样才能解决这个问题?有没有比这更好的了?继承是一种方式,但由于我们可能在一个包装中有变量实例,我认为它没用.
编辑
这是我的测试课
struct testClass{ int f(int a,char b){ return a+b; }};
我使用wrap L而不是wrap T的原因是返回类型可能并不总是T.
解决方法 你可以尝试这样的事情:#include <iostream>#include <type_traits>template<class T,bool = false>struct wrap{ template <typename... Args> wrap(Args&&... args) : a{std::forward<Args>(args)...} {}; template<class L,class...R> wrap<L,std::is_fundamental<L>::value> operator() (L(T::*f)(R...),R...r){ return wrap<L,std::is_fundamental<L>::value > {(a.*f)(r...)}; } T a;};template<class T>struct wrap <T,true>{ template <typename... Args> wrap(Args&&... args) : a{std::forward<Args>(args)...} {} template<class L,std::is_fundamental<L>::value> operator() (L(*f)(T a,R...),R...r){ return wrap<L,std::is_fundamental<L>::value > {f(a,r...)}; } T a;};class testClass { int m;public:testClass(int _m) : m{_m}{} int multiAdd(int x,char y) { m += x + y; return m; }};int add(int a,char b){ return a+b;}int main(){ wrap<testClass> a{0}; std::cout << a(&testClass::multiAdd,'d')(add,'a').a<<std::endl; wrap<int,true> b{3}; std::cout << b(add,'a').a<<std::endl;}
cpp.sh/6icg
总结以上是内存溢出为你收集整理的c – 如何编写一个不断敲击输出的包装器?全部内容,希望文章能够帮你解决c – 如何编写一个不断敲击输出的包装器?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)