具有默认行为的函数指针

阿丹

在我的程序中,我有很多指向外部库提供的函数的指针。其中有些返回价值,有些则没有。

如果外部库未提供函数(指针为NULL),并且函数应返回值,则程序应采用默认值(在编译时已知)。

我试图完成的工作是减少if语句的数量,并使用以下用例将指针包装在类中:

enum E { e1, e2, e3 };
UserFunction<uint8_t(int, int), 0> callback1 { user_function_ptr }; // Calls and returns value of user_function_ptr
UserFunction<uint8_t(), 0> callback2 { nullptr }; // Returns 0
UserFunction<uint8_t(), 1> callback3 { nullptr }; // Returns 1
UserFunction<E(int), e1> callback4 { user_function_ptr2 }; // Returns enum value and takes one integer argument
UserFunction<void(int)> callback5 { user_function_ptr3 }; // No return value, one argument
UserFunction<void()> callback6 { nullptr }; // Should perform noop

到目前为止,我正在为返回值的函数工作:

template <class Sign, int Def>
struct UserF;

template <class R, int Def, class... Args>
struct UserF<R(Args...), Def> {
    typedef R Signature(Args...);
    typedef typename std::add_pointer<Signature>::type SignaturePtr;

    static R Default(Args... args) {
        return (R) Def;
    }

    UserF() {
        functionToCall = Default;
    }

    UserF(SignaturePtr userFunction) {
        if (userFunction != nullptr) {
            functionToCall = userFunction;
        } else {
            functionToCall = Default;
        }
    }

    R operator() (Args... args) {
        return functionToCall(args...);
    }

private:
    SignaturePtr functionToCall;
};

上面代码的问题是,它强制默认值为int我所能做的就是将UserF模板更改为以下形式:

template <class R, R Def, class... Args>
struct UserF {
    // ...
};
// use case
UserF<E, e1, int> callback; // Returns E, takes int, default e1

但是,如果可能的话,我宁愿使用

UserF<R(Args...), Default> callback; // preferred
UserF<Default, R(Args...)> callback; // if above is not possible
UserF<void(Args...)> callback; // if no return value

我宁愿不使用,std::function因为我知道我将只处理函数的指针,而不处理成员函数,函子对象等的指针。也不允许boost(允许C ++ 11)。

总而言之,问题是:如何强制对默认返回值进行类型检查。

Yakk-亚当·内夫罗蒙特
template<class Sig>
struct return_type;
template<class Sig>
using return_type_t=typename return_type<Sig>::type;
template<class R,class...Args>
struct return_type<R(Args...)>{
  using type=R;
};

template <class Sign, return_type_t<Sign> Def>
struct UserF;

是大多数。要处理void您将需要一个标志技巧:

struct void_flag{};
template<class T>
using flag_void=
  typename std::conditional<std::is_same<T,void>{},void_flag*,T>::type;

template <class Sign, flag_void<return_type_t<Sign>> Def=nullptr>
struct UserF;

template <class R, R Def, class... Args>
struct UserF<R(Args...), Def>{
  // body

template <class... Args>
struct UserF<void(Args...), 0>{
  // body

非积分非指针会出现问题R,因为您不能将a传递double给a template一种方法是升级doubledouble const*Def,并让它自动解除引用:

template <class R, R const* Def, class... Args>
struct UserF<R(Args...), Def>{
  // body

而这样做flag_voidT=doubleT=double const*

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

声明具有默认指针值的函数

来自分类Dev

具有std :: string属性的默认移动构造函数行为

来自分类Dev

具有缺失行为默认行为的元函数,以及如何检测随机访问

来自分类Dev

具有类内初始化的默认默认构造函数的行为是什么?

来自分类Dev

Golang:具有函数类型的奇怪行为

来自分类Dev

具有函数指针参数的模板类

来自分类Dev

具有指针参数的C ++模板函数

来自分类Dev

具有函数的数组和指针的总和

来自分类Dev

具有不同返回类型的函数指针

来自分类Dev

具有结构指针的相等函数

来自分类Dev

具有指针参数的C ++模板函数

来自分类Dev

具有函数的数组和指针的总和

来自分类Dev

C-具有前后增量的指针行为

来自分类Dev

具有默认参数的可行函数

来自分类Dev

具有默认参数的JavaScript函数

来自分类Dev

具有默认参数的Unity构造函数

来自分类Dev

具有默认参数的PHP调用函数

来自分类Dev

具有默认值的实例变量的Morphia投影行为

来自分类Dev

具有默认参数的模板参数推导行为

来自分类Dev

为什么此框架具有默认的OVER()行为?

来自分类Dev

具有默认值的嵌套分配的奇怪的哈希行为

来自分类Dev

具有方法指针参数默认值的模板

来自分类Dev

Swift:在非默认参数之前具有默认参数的函数

来自分类Dev

在具有参数的对象中使用函数的函数指针

来自分类Dev

具有多个参数的函数指针寻址函数

来自分类Dev

在C函数内部具有函数的参数和指针

来自分类Dev

具有void * a和指针函数作为参数的函数

来自分类Dev

具有函数指针的TypeDef:函数不存在

来自分类Dev

类型类:具有默认实现的函数与单独的函数

Related 相关文章

热门标签

归档