我刚开始用可变参数版本替换我的一些旧模板,以避免由于参数数量可变而导致的代码重复(或丑陋的宏)。
我遇到但尚未解决的一个问题是:如何从属于'混合类型名...'的任何类型中删除const&?
这是我的示例:
#include <tuple> // old version to be replaced namespace old_version { template<typename T> struct struct_const_deref { typedef T Type; }; template<typename T> struct struct_const_deref < const T& > { typedef T Type; }; template < typename F, typename T1 > void exec(F* pObj, void(F::*pFct)(T1)) { typename struct_const_deref<T1>::Type t1; // some code that fills t1 (pObj->*pFct)(t1); } template < typename F, typename T1 , typename T2 > void exec(F* pObj, void(F::*pFct)(T1, T2)) { typename struct_const_deref<T1>::Type t1; typename struct_const_deref<T2>::Type t2; // some code that fills t1, t2 (pObj->*pFct)(t1, t2); } } // new variadic version namespace variadic { template< typename... Args > struct struct_const_deref_tuple { typedef std::tuple< Args... > Tuple; }; template< typename... Args > struct struct_const_deref_tuple < const Args&... > { typedef std::tuple< Args... > Tuple; }; template < typename F, typename... Args > void exec(F* pObj, void(F::*pFct)(Args... args)) { typename struct_const_deref_tuple< Args... >::Tuple tN; // some code that fills tN // some helper template that 'extracts' the tuple and calls (pObj->*pFct)(ExtractedArgs...) } } struct Test { void foo(int i) {} void bar(const float& f, const int& i) {} void buu(const float& f, int i) {} }; int main(int argc, char* argv[]) { Test t; old_version::exec(&t, &Test::foo); // ok old_version::exec(&t, &Test::bar); // ok old_version::exec(&t, &Test::buu); // ok variadic::exec(&t, &Test::foo); // ok variadic::exec(&t, &Test::bar); // ok variadic::exec(&t, &Test::buu); // fails (the struct_const_deref_tuple does not 'catch' my case; 'tN' will be std::tuple<const float&, int> return 0; }
由于旧解决方案的每个参数数量都需要一个版本,所以我希望将其替换为可变参数解决方案。
不幸的是可变参数版本失败
Test::buu
因为tN变为
std::tuple<const float&, int>
但显然必须是
std::tuple<float, int>
为我工作。
欢迎任何想法:)
我刚刚开始用可变参数版本替换一些旧模板,以避免由于变量数量可变而导致的代码重复(或丑陋的宏)。我遇到但没有遇到一个问题...
基本问题是pack expansion。另外,为了简单起见,您可以使用type_traits中的std :: decay(c ++ 11)或std :: decay_t(c ++ 14)。以下代码应使用c ++ 14编译。
请看一下