C++ 如何使用BOOST二进制函数概念?

C++ 如何使用BOOST二进制函数概念?,c++,boost,metaprogramming,template-meta-programming,C++,Boost,Metaprogramming,Template Meta Programming,没有我能找到的文档,也没有我在谷歌搜索时看到的任何相关内容: 我有一个功能,我想产生一个签名: (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

没有我能找到的文档,也没有我在谷歌搜索时看到的任何相关内容:

我有一个功能,我想产生一个签名:

(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>
//应该成功
boost::二进制函数
//应该失败
boost::二进制函数
编译失败,因为它不喜欢第一个参数类型。不幸的是,我不确定他们文档中的
是什么意思。如果我有这两个函数,我如何测试这些概念


谢谢

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

#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>));
}
#包括
无效剂量测定(int x,int y);
void dosomethingfront(浮动x,浮动y);
int main(){
BOOST_-CONCEPT_-ASSERT((BOOST::BinaryFunction));
BOOST_-CONCEPT_-ASSERT((BOOST::BinaryFunction));
}
如果您想在函数参数的基础上严格检查这个概念,那么可以使用基于显式模板专门化的类型特征来检查。以下内容并未穷尽所有可能的常量和挥发性限定

#include <iostream>
#include <type_traits>

template <typename F>
struct is_void_int_int : std::false_type {};

// Free function
template <>
struct is_void_int_int<void(int, int)> : std::true_type {};

// Pointer to function
template <>
struct is_void_int_int<void (*)(int, int)> : std::true_type {};

// Reference to function
template <>
struct is_void_int_int<void (&)(int, int)> : std::true_type {};

// Pointer to member function
template <typename C>
struct is_void_int_int<void (C::*)(int, int)> : std::true_type {};

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

struct A {
    void operator()(int, int) {}
};

struct B {
    void bar(int, int) {}
};

int main() {
    static_assert(is_void_int_int<decltype(dosomething)>::value, "!");
    static_assert(is_void_int_int<decltype((dosomething))>::value, "!");
    static_assert(is_void_int_int<decltype(&dosomething)>::value, "!");
    static_assert(is_void_int_int<decltype(&A::operator())>::value, "!");
    static_assert(is_void_int_int<decltype(&B::bar)>::value, "!");
  //static_assert(is_void_int_int<decltype(dosomethingwront)>::value, "!"); // BOOM!
}
#包括
#包括
样板
结构是_void_int_int:std::false_type{};
//自由函数
样板
结构是_void_int_int:std::true_type{};
//指向函数的指针
样板
结构是_void_int_int:std::true_type{};
//对函数的引用
样板
结构是_void_int_int:std::true_type{};
//指向成员函数的指针
样板
结构是_void_int_int:std::true_type{};
无效剂量测定(int x,int y);
void dosomethingfront(浮动x,浮动y);
结构A{
void运算符()(int,int){}
};
结构B{
空条(int,int){}
};
int main(){
静态断言(is_void_int_int::value,“!”;
静态断言(is_void_int_int::value,“!”;
静态断言(is_void_int_int::value,“!”;
静态断言(is_void_int_int::value,“!”;
静态断言(is_void_int_int::value,“!”;
//静态断言(is\u void\u int\u int::value,“!”;//BOOM!
}