c++ - 基于模板参数的重载解析
问题描述
我不确定在 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
并不总是有效。因此,我需要知道编译时构造是否可以实现我需要做的事情。
解决方案
沿着这些思路,也许:
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)>{});
}
};
推荐阅读
- sql - SET TRANSACTION ISOLATION LEVEL 的范围,如何确保仅在当前表或数据库上设置
- c# - 使用 RDotNet 时如何为“arrow.dll”加载符号?
- python - 将数组值从行拆分为新列 PySpark
- prometheus - 使用减法后如何在promethues中获得持续时间桶的速率
- python - 为什么我们在计算移动平均窗口时需要从右到左读取列表?
- javascript - 使用 Google 跟踪代码管理器动态生成架构/JSON-LD 标记,但不断收到以下错误:“无法解析的结构化数据”
- java - 解析具有不同行长和数据类型的文件
- excel - 计算多个条件的 if 和 sum
- c++ - 如何使用 Qt 应用程序将 Id 添加到 kml 文件中的“QDomElement”标签
- javascript - 在 API 中发送分页值时遇到问题