如何从模板生成带有const或非const成员函数的类?

时间:2014-12-10 21:36:14

标签: c++ templates c++11

我有以下模板:

template<typename Signature>
class TypeErasedFunctor;

template<typename R, typename... Args>
class TypeErasedFunctor<R(Args...)>
{
public:

    virtual R operator()(Args... args) = 0;
};

它可以用于为这样的仿函数生成接口类:

using SemaphoreFunctor = TypeErasedFunctor<int(Semaphore&)>;

可以看出,成员函数operator()是非const的。我想提出以下问题 - 是否有任何选项可以选择是否应创建const或非const变体而不是这两个:

  • 使用SFINAE(可能带有std::enable_if<>)和模板的附加参数
  • 使用单独的模板ConstTypeErasedFunctor

1 个答案:

答案 0 :(得分:3)

您可以在与重载相同的对象上同时拥有(const和no const)版本的operator()。但是如果你想在声明对象时只想轻松选择一个,你可以使用类似的东西:

template<bool b, typename Signature>
class TypeErasedFunctor;

template<typename R, typename... Args>
class TypeErasedFunctor<true,R(Args...)>
{
    public:
        virtual R operator() (Args... args) const = 0;
};

template<typename R, typename... Args>
class TypeErasedFunctor<false,R(Args...)>
{
    public:
        virtual R operator()(Args... args) = 0;
};

template<bool b>
using SemaphoreFunctor = TypeErasedFunctor<b,int(Semaphore&)>;

稍后,在客户端代码中,您可以选择剩余的通用参数:

SemaphoreFunctor<true> object_with_const_op;
SemaphoreFunctor<false> object_with_no_const_op;