我不确定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。因此,我需要知道使用编译时构造是否可以实现所需的功能。
答案 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)>{});
}
};