c – 如何提取__VA_ARGS__?
发布时间:2020-12-16 09:44:36 所属栏目:百科 来源:网络整理
导读:我有一个宏来为每个args调用静态函数. 例如: #define FOO(X) X::do();#define FOO_1(X,Y) X::do(); Y::do(); 我的问题是我需要使用带有可变数量参数的foo,是否可以使用__VA_ARGS__? 如下面的行: #define FOO(...) __VA_ARGS__::do() ? 谢谢 解决方法 宏扩
我有一个宏来为每个args调用静态函数.
例如: #define FOO(X) X::do(); #define FOO_1(X,Y) X::do(); Y::do(); 我的问题是我需要使用带有可变数量参数的foo,是否可以使用__VA_ARGS__? 如下面的行: #define FOO(...) __VA_ARGS__::do() ? 谢谢 解决方法
宏扩展不像带有可变参数模板的参数包扩展那样工作.你所拥有的将扩展到:
X,Y::do(); 而不是 X::do(); Y::do(); 如你所愿.但是在C 11中你可以使用可变参数模板.例如,你可以这样做你想要的: #include <iostream> struct X { static void foo() { std::cout << "X::foo()" << std::endl; }; }; struct Y { static void foo() { std::cout << "Y::foo()" << std::endl; }; }; struct Z { static void foo() { std::cout << "Z::foo()" << std::endl; }; }; int main() { do_foo<X,Y,Z>(); } 你需要的只是这个(相对简单的)机器: namespace detail { template<typename... Ts> struct do_foo; template<typename T,typename... Ts> struct do_foo<T,Ts...> { static void call() { T::foo(); do_foo<Ts...>::call(); } }; template<typename T> struct do_foo<T> { static void call() { T::foo(); } }; } template<typename... Ts> void do_foo() { detail::do_foo<Ts...>::call(); } 这是一个live example. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |