根据模板参数的重载分辨率

时间:2020-06-07 00:41:17

标签: c++ templates

我不确定C ++是否可以实现我想做的事情,所以在这里问。

我有一个模板化类MyClass,该类具有可选的模板参数idx。我还有另一个非模板类OtherClass。我想做的是基于idx做某种过载解析:

  • 如果提供了idx(值不是-1),我想调用OtherClass::otherMethod的模板版本。

  • 否则,我要调用OtherClass::otherMethod的非模板版本。

请注意,如果T==SomeType的用户,MyClass将提供idx。在其他情况下,不需要idx。同样,保证OtherClass::otherMethod的两个不同版本采用不同的输入类型。在我看来,我需要以某种方式在OtherClass::otherMethod<>时禁用idx == -1的重载分辨率,并仅在idx!= -1时启用它。

下面的代码概述了我所拥有的:

template <typename T, int32_t idx=-1>
class MyClass
{
    OtherClass m_other;

    void myMethod(T arg)
    {
        // If idx == -1
        // m_other.otherMethod<idx>(arg);

        // else
        // m_other.otherMethod(arg);
    }
}

class OtherClass
{

    template<int32_t idx>
    void otherMethod(SomeType arg)
    {
        // Some operation that depends on idx
    }

    void otherMethod(YetAnotherType arg)
    {

    }
}

编辑:
一个明显的解决方案是使用一些默认(且未使用)参数的模板void otherMethod(YetAnotherType arg)。我正在寻找除此以外的解决方案。

EDIT2 :(回复评论)
我正在使用C ++ 11。简单的if并不总是有效,as demonstrated here。因此,我需要知道使用编译时构造是否可以实现所需的功能。

1 个答案:

答案 0 :(得分:1)

也许是这样:

template <typename T, int32_t idx=-1>
class MyClass {
  OtherClass m_other;

  void myMethodHelper(T arg, std::true_type) {
       m_other.otherMethod<idx>(arg);
  }
  void myMethodHelper(T arg, std::false_type) {
       m_other.otherMethod(arg);
  }

public:
  void myMethod(T arg) {
    myMethodHelper(arg, std::integral_constant<bool, (idx >= 0)>{});
  }
};

Demo

相关问题