我有一个代码,大量使用模板。一个例子是这样的:

template <class MT>
struct class_method_info;

template <class T, class Res, class... Args>
struct class_method_info<Res(T::*)(Args...)>
{
    typedef std::tuple<Args&&...> ArgsTuple;
    typedef T ClassType;
    typedef Res RetVal;
    static constexpr std::size_t ArgsCount = sizeof...(Args);
    static constexpr bool IsClassMethod = true;
};

这适用于非const成员函数指针。

如果将Res(T::*)(Args...)更改为Res(T::*)(Args...) const,则可以传递const函数指针。但是,即使这是一个有效的解决方案,也弄乱了我的代码,因为现在我的工作量增加了一倍,并且有很多这样的事情。

还有其他办法吗?

最佳答案

您可以为const添加一个特殊化this,它将从另一个继承大多数实现:

template <class MT>
struct class_method_info;

template <class T, class Res, class... Args>
struct class_method_info<Res(T::*)(Args...)>
{
    typedef std::tuple<Args&&...> ArgsTuple;
    typedef T ClassType;
    typedef Res RetVal;
    static constexpr std::size_t ArgsCount = sizeof...(Args);
    static constexpr bool IsClassMethod = true;
    static constexpr bool IsConstThis = false;
};


template <class T, class Res, class... Args>
struct class_method_info<Res(T::*)(Args...) const> : class_method_info<Res(T::*)(Args...)>
{
    static constexpr bool IsConstThis = true;
};

demo

09-10 04:29
查看更多