C ++函数转换问题

时间:2010-11-14 23:05:45

标签: c++ templates boost metaprogramming type-conversion

我尝试使用boost::function<x>包装器来存储和转换我的功能对象,我想知道是否有针对的编译检查执行从任意类型T到类型{的转换{1}}存在“

这是一个代码示例:

boost::function<x>

现在 - 是否存在实施struct Functor { int operator()(int) { return 5; } }; // Should not fire static assertion. STATIC_ASSERT( (IS_CONVERTIBLE<Functor, boost::function<int (int)> >::value) ); // Should fire static assertion. STATIC_ASSERT( (IS_CONVERTIBLE<Functor, boost::function<int (std::string)> >::value) ); 检查的方法?


我尝试使用IS_CONVERTIBLE类型特征检查,但对于任何boost::is_convertible类型都会产生true

Functor

我也有以下尝试:

bool value1 = boost::is_convertible<Functor, 
                                    boost::function<int (int)> >::value;

bool value2 = boost::is_convertible<Functor,
                                    boost::function<int (std::string)> >::value;

// At this point both 'value1' and 'value2' equal TRUE.

我真的希望能够在编译时检查这种转换的可能性,所以 如果有人知道如何实现这一点,我将不胜感激。

谢谢。

2 个答案:

答案 0 :(得分:1)

当您测试任何类型是否可转换为任何 boost::is_convertible类型时,

boost::function会生成true,因为boost::function具有转换构造函数采用任何类型的模板。

因为存在这个转换构造函数,所以我不知道有一种简单的方法可以测试某个类型实际是否可以转换为std::function

答案 1 :(得分:1)

除了@James所写的内容之外,您似乎还希望拥有类似is_callable的内容。 These class templates处理函数/函数指针和函数对象类,或者对最多5个参数的引用。使用它们需要您自担风险:)