使用棘手的签名从 std::unary _function 迁移出来

问题描述 投票:0回答:1

我需要迁移一个古老的代码库以支持 c++17。这意味着删除 auto_ptr、unary_function 等。我已经成功删除了 unary_function 的几个实例,但这一个是一个谜题。

以下是先决条件:Traits 宏、RemoveConstRef 模板。

template <class T>
struct RemoveConstRef {
    typedef T type;
};

#define FPTRAITS_BASIC( _type, _paramType )                                                                            \
    template <>                                                                                                        \
    struct Traits<_type> {                                                                                             \
        typedef _type param_type;                                                                                      \
        typedef _type return_type;                                                                                     \
                                                                                                                       \
        static int fp_param_type() { return _paramType; }                                                              \
        static int fp_return_type() { return _paramType; }                                                             \
                                                                                                                       \
        static param_type get_parameter( FPValue& fpValue ) { return FP_FIELD( _paramType, fpValue ); }                \
        static void get_return_value( FPValue& fpOutValue, return_type val ) {                                         \
            return fpOutValue.LoadPtr( _paramType, FP_RSLT( _paramType, val ) );                                       \
        }                                                                                                              \
    };

FPTRAITS_BASIC( int, TYPE_INT )
FPTRAITS_BASIC( float, TYPE_FLOAT )

...

原创暗示


    template <class T, int Index>
    struct get_parameter : public std::unary_function< FPParams*, typename Traits< typename RemoveConstRef<T>::type >::param_type >{
        inline result_type operator()( FPParams* p ) const {
            return Traits< typename RemoveConstRef<T>::type >::get_parameter( p->params[Index] );
        }
    };

c++17 尝试

    template <class T, int Index>
    struct get_parameter : public std::function<typename Traits< typename RemoveConstRef<T>::type >::param_type(FPParams*) >{
        inline result_type operator()( FPParams* p ) const {
            return Traits< typename RemoveConstRef<T>::type >::get_parameter( p->params[Index] );
        }
    };

这些是编译器错误:

错误 C2143:语法错误:缺少 ';'在运算符关键字 '(' 之前

templates c++17
1个回答
0
投票

我认为你错过了

std::unary_function
std::function
的要点。两者完全无关,像你一样重写
get_parameter
是没有意义的。

std::unary_function
提供了
argument_type
result_type
。有了像
auto
这样的新 C++11 功能,这些 typedef 就不再需要了。只需将其完全删除即可。

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