我需要迁移一个古老的代码库以支持 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:语法错误:缺少 ';'在运算符关键字 '(' 之前
我认为你错过了
std::unary_function
与std::function
的要点。两者完全无关,像你一样重写get_parameter
是没有意义的。
std::unary_function
提供了argument_type
和result_type
。有了像 auto
这样的新 C++11 功能,这些 typedef 就不再需要了。只需将其完全删除即可。