首页 > 解决方案 > 基于模板参数的重载解析

问题描述

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

我有一个MyClass具有可选模板参数的模板类idx。我有另一个非模板类OtherClass。我想做的是根据以下内容进行某种重载解决方案idx

请注意,如果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并不总是有效。因此,我需要知道编译时构造是否可以实现我需要做的事情。

标签: c++templates

解决方案


沿着这些思路,也许:

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)>{});
  }
};

演示


推荐阅读