首页 > 代码库 > [C++模板]Clang3.9使用变参模拟实现CheckerFn和Checker
[C++模板]Clang3.9使用变参模拟实现CheckerFn和Checker
Clang3.9使用变参模拟实现CheckerFn和Checker
一,使用变参实现CheckerFn
1,头文件
/********************************* * * Author : szyu * * Date : 2017.1.4 * ***********************************/ #ifndef __SZYU_CLANG__ #define __SZYU_CLANG__ #include <iostream> /******************************** * * clang3.9使用变参实现CheckerFn * *********************************/ template <typename T> class CheckerFn; template <typename T, typename... Args> class CheckerFn<T(Args...)> { private: typedef T (*Func)(Args...); Func Fn; public: CheckerFn() { std::cout << "In CheckerFn::CheckerFn()" << std::endl; } CheckerFn( Func f ) : Fn( f ) { std::cout << "In CheckerFn::CheckerFn(Func f)" << std::endl; } T operator()( Args... args) const { Fn( args... ); } }; #endif
2,测试用例
/******************************** * * Author : szyu * * Date : 2017.1.4 * ***********************************/ #include "param.h" void func11() { std::cout << "In func11" << std::endl; } void func12( int v ) { std::cout << "In func12" << std::endl; std::cout << "Args..." << v << std::endl; } void func13( int v, char ch ) { std::cout << "In func13" << std::endl; std::cout << "Args1..." << v << ", Args2..." << ch << std::endl; } void test1() { typedef CheckerFn<void ()> CheckOne; CheckOne one( func11 ); one(); std::cout << "**********************************" << std::endl; typedef CheckerFn<void (int)> CheckTwo; CheckTwo two( func12 ); int value = 7; two( value ); std::cout << "**********************************" << std::endl; typedef CheckerFn<void (int, char)> CheckThree; CheckThree three( func13 ); value = 9; char ch = ‘B‘; three( value, ch ); } int main( int argc, char *argv[] ) { test1(); return 0; }
3,执行结果
二,使用变参实现Checker
1,头文件
/********************************* * * Author : szyu * * Date : 2017.1.4 * ***********************************/ #ifndef __SZYU_CLANG__ #define __SZYU_CLANG__ #include <iostream> /******************************** * * clang3.9使用变參实现Checker * *********************************/ class Register1 { public: static void _register() { std::cout << "In Register1::_register()" << std::endl; } }; class Register2 { public: static void _register() { std::cout << "In Register2::_register()" << std::endl; } }; class Register3 { public: static void _register() { std::cout << "In Register3::_register()" << std::endl; } }; template <typename T1, typename... Args> class Checker : public T1, public Args... { public: static void _register() { std::cout << "In Checker<T1, Args...>::_register()" << std::endl; T1::_register(); Checker<Args...>::_register(); } }; template <typename T1> class Checker<T1> { public: static void _register() { std::cout << "In Checker<T1>::_register()" << std::endl; T1::_register(); } }; #endif
2,测试用例
/********************************* * * Author : szyu * * Date : 2017.1.4 * ***********************************/ #include "param2.h" void test1() { Checker<Register1>::_register(); std::cout << "**********************************" << std::endl; Checker<Register1, Register2>::_register(); std::cout << "**********************************" << std::endl; Checker<Register1, Register2, Register3>::_register(); } int main( int argc, char *argv[] ) { test1(); return 0; }
3,执行结果
[C++模板]Clang3.9使用变参模拟实现CheckerFn和Checker
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。