如何为类型名称中的每个元素删除const ref修饰符……T

问题描述 投票:2回答:2

我刚开始用可变参数版本替换我的一些旧模板,以避免由于参数数量可变而导致的代码重复(或丑陋的宏)。

我遇到但尚未解决的一个问题是:如何从属于'混合类型名...'的任何类型中删除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> 

为我工作。

欢迎任何想法:)

我刚刚开始用可变参数版本替换一些旧模板,以避免由于变量数量可变而导致的代码重复(或丑陋的宏)。我遇到但没有遇到一个问题...

c++ variadic-templates stdtuple
2个回答
2
投票

基本问题是pack expansion。另外,为了简单起见,您可以使用type_traits中的std :: decay(c ++ 11)或std :: decay_t(c ++ 14)。以下代码应使用c ++ 14编译。


0
投票

请看一下

© www.soinside.com 2019 - 2024. All rights reserved.