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!
}