代码之家  ›  专栏  ›  技术社区  ›  Dr.Knowitall

如何使用BoostBinaryFunction概念?

  •  0
  • Dr.Knowitall  · 技术社区  · 7 年前

    我找不到任何文档,也找不到任何与谷歌搜索相关的文档:

    我有一个函数,我想生成一个签名:

    (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 回复  |  直到 7 年前
        1
  •  1
  •   Henri Menke    7 年前

    decltype((dosomething)) dosomethingwront int float

    #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>));
    }
    

    #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!
    }
    
    推荐文章