gpt4 book ai didi

c++ - 使用 mpl::if_、boost::function 和 typedef 无效的问题

转载 作者:行者123 更新时间:2023-11-30 03:04:52 25 4
gpt4 key购买 nike

我是 Boost.MPL 库的新手,有一些“初学者问题”

看看这个例子:

template < typename F >
struct A {
typedef boost::function_types::parameter_types<F> P;
typedef typename boost::function_types::result_type<F>::type R;

typedef typename boost::mpl::if_< boost::is_same< R, void >,
boost::function< void ( void ) > ,
boost::function< void ( R ) > >::type TTT;
A() { }
};

int main(int argc, const char *argv[]) {
A<int(int, float)> ok; // working
A<void(int, float)> compile_error; // non-working

return 0;
}

编译时我得到:

xxx.cxx: In instantiation of ‘A<void(int, float)>’:
xxx.cxx:108:25: instantiated from here
xxx.cxx:100:77: error: invalid parameter type
‘boost::mpl::aux::wrapped_type<boost::mpl::aux::type_wrapper<void>
>::type’
xxx.cxx:100:77: error: in declaration ‘A<F>::TTT’

这里有什么问题,我该如何解决?

据我了解,编译器只应评估 mpl::if_ 的选定部分....

最佳答案

首先解释错误,需要注意的是在参数列表中使用typedef to void是错误的。这两个 GCC 错误报告(320589278)描述了问题,指出这是标准的要求。

所以基本上,根据标准的 §8.3.5/2,这是合法的:

void foo(void);

虽然这不是:

typedef void type;
void foo(type);

这解释了为什么您首先需要 if_。现在要解释为什么仍然有错误,您需要了解 MPL 中的惰性求值仅适用于元函数:只要您不访问元函数内的 type,它就不会被求值。此处,if_ 的参数未被求值(它们不能被求值,因为它们不是元函数),但这并不意味着它们未被实例化。

为了克服这个问题,您可以将 function 实例化嵌入到可以延迟计算的元函数中:

template < typename R, typename P >
struct get_function
{
typedef boost::function< R (P) > type;
};

template < typename F >
struct A {
typedef boost::function_types::parameter_types<F> P;
typedef typename boost::function_types::result_type<F>::type R;

typedef typename
boost::mpl::if_<
boost::is_same< R, void >,
boost::mpl::identity< boost::function< void (void) > > ,
get_function< void, R >
>::type::type TTT;

A() { }
};

这样,错误的 void (typedef_to_void) 永远不会出现。

更好的解决方案甚至是为 void 情况专门化 get_function 元函数:

template < typename R, typename P >
struct get_function
{
typedef boost::function< R (P) > type;
};

template < typename R >
struct get_function< R, void >
{
typedef boost::function< R (void) > type;
};

template < typename F >
struct A {
typedef boost::function_types::parameter_types<F> P;
typedef typename boost::function_types::result_type<F>::type R;

typedef typename get_function< void, R >::type TTT;

A() { }
};

不再需要if_!

关于c++ - 使用 mpl::if_、boost::function 和 typedef 无效的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8258267/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com