const和非const函数作为模板参数参数

时间:2019-08-18 12:21:09

标签: c++ function templates

我一直在通过创建very simple event/callback system来加深对模板和函数指针的理解。我到了要点,不管它的常量性如何,我都想以更多...“ template-y / generic ”的方式执行给定的函数。

目前有两个包装器,一个用于非const函数,另一个用于const函数,虽然效果很好,但由于它们基本相同而显得有些错误。

这是我目前所拥有的部分:

非常量函数包装器

template<typename CallerType, typename ReturnType, typename ...Args>
    class RegularMemberFunctionWrapper : public MemberFunctionWrapper<CallerType, ReturnType, Args...>
    {
    private:
        ReturnType(CallerType::* funcPtr)(Args...);
    }

const函数包装器

template<typename CallerType, typename ReturnType, typename ...Args>
    class ConstMemberFunctionWrapper : public MemberFunctionWrapper<CallerType, ReturnType, Args...>
    {
    private:
        ReturnType(CallerType::*funcPtr) (Args...) const;
    }

理想情况下,我只希望有一个父级“ MemberFunctionWrapper”,通过模板参数定义该函数是否为const

template<typename CallerType, typename FunctionSignature, typename ...Args>
    MemberFunctionWrapper
    {
    private:
        FunctionSignature *funcPtr;
    }

使用模板是否还可以实现类似的功能?

我在线上看到了一些示例,其中一个模板参数将定义另一个模板参数使用的类型(例如template<typename T, T T2>),所以也许有什么用?也许我想要的不是 class 模板,而是派生类调用的 function 模板(因此达到了消除代码重复的目的)?

请赐教。

1 个答案:

答案 0 :(得分:1)

不确定它想要什么,但是您可能会:

template<typename Sig>
class Wrapper
{
private:
    Sig funcPtr;
};

以及诸如此类的可能用法:

Wrapper<void (C::*) (int) const> w1;
Wrapper<void (C::*) (int)> w2;

Demo