如何使用BOOST BinaryFunction概念?

时间:2018-07-08 03:13:10

标签: c++ boost metaprogramming template-meta-programming

我找不到任何文档,也没有在进行Google搜索时看到的任何相关信息:

我具有要产生以下特征的功能:

(void)(int,int)

所以当我运行这两个函数时:

void dosomething(int x, int y);
void dosomethingwront(float x, float y);

通过:

// Should succeed
boost::BinaryFunction<dosomething,void,int,int>
// Should fail
boost::BinaryFunction<dosomethingwrong,void,int,int>

编译失败,因为它不喜欢第一个参数类型。不幸的是,我不确定文档中<class Func,...>的含义。如果我具有这两个功能,该如何测试这些概念?

谢谢

1 个答案:

答案 0 :(得分:1)

模板参数必须是类型。  您可以使用decltype((dosomething))。请注意,您的概念不会因dosomethingwront而失败,因为int可转换为float,并且该概念会检查二进制函数是否可通过{{1}调用 },而不是检查功能签名。

int

如果要基于函数参数严格检查此概念,则可以使用基于显式模板专门化的类型特征来进行检查。以下内容并未穷尽所有可能的const和volatile限定。

#include <boost/concept_check.hpp>

void dosomething(int x, int y);
void dosomethingwront(float x, float y);

int main() {
    BOOST_CONCEPT_ASSERT((boost::BinaryFunction<decltype((dosomething)),void,int,int>));
    BOOST_CONCEPT_ASSERT((boost::BinaryFunction<decltype((dosomethingwront)),void,int,int>));
}