variadic-function.c
来自「用于进行gcc测试」· C语言 代码 · 共 97 行
C
97 行
// { dg-options "-std=gnu++0x" }// { dg-do "run" }// A basic implementation of TR1's function using variadic teplates// Contributed by Douglas Gregor <doug.gregor@gmail.com>#include <cassert>template<typename Signature>class function;template<typename R, typename... Args>class invoker_base{ public: virtual ~invoker_base() { } virtual R invoke(Args...) = 0; virtual invoker_base* clone() = 0;};template<typename F, typename R, typename... Args>class functor_invoker : public invoker_base<R, Args...>{ public: explicit functor_invoker(const F& f) : f(f) { } R invoke(Args... args) { return f(args...); } functor_invoker* clone() { return new functor_invoker(f); } private: F f;};template<typename R, typename... Args>class function<R (Args...)> { public: typedef R result_type; function() : invoker (0) { } function(const function& other) : invoker(0) { if (other.invoker) invoker = other.invoker->clone(); } template<typename F> function(const F& f) : invoker(0) { invoker = new functor_invoker<F, R, Args...>(f); } ~function() { if (invoker) delete invoker; } function& operator=(const function& other) { function(other).swap(*this); return *this; } template<typename F> function& operator=(const F& f) { function(f).swap(*this); return *this; } void swap(function& other) { invoker_base<R, Args...>* tmp = invoker; invoker = other.invoker; other.invoker = tmp; } result_type operator()(Args... args) const { assert(invoker); return invoker->invoke(args...); } private: invoker_base<R, Args...>* invoker;};struct plus { template<typename T> T operator()(T x, T y) { return x + y; }};struct multiplies { template<typename T> T operator()(T x, T y) { return x * y; }};int main(){ function<int(int, int)> f1 = plus(); assert(f1(3, 5) == 8); f1 = multiplies(); assert(f1(3, 5) == 15); return 0;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?