1)我有两个类class A
和class B
,它们都有一个名为foo
但有不同参数列表的方法。
class A {
public:
void foo(int a);
};
class B {
public:
void foo(int a, int b);
};
2)此外,我的class C
模板参数T
也有foo
方法,如下所示
template <typename T>
class C {
public:
void foo();
private:
T t_;
int a_;
int b_;
};
3)我想同时使用class A
和class B
作为class C
的模板参数。
说我想要实现方法C::foo
,如下所示:
template <typename T>
void C<T>::foo()
{
if (compile time check: T has foo(int a, int b))
t_.foo(a_, b_);
else
t_.foo(a_);
}
如何在if
中表达上述C++11
声明?
答案 0 :(得分:6)
使用SFINAE(函数模板重载)。
template <typename T>
class C {
private:
T t_;
int a_;
int b_;
public:
template <typename X = T>
auto foo() -> decltype (std::declval<X>().foo(a_)) {
t_.foo(a_);
}
template <typename X = T>
auto foo() -> decltype (std::declval<X>().foo(a_, b_)) {
t_.foo(a_, b_);
}
};
答案 1 :(得分:4)
如果您知道哪种类型包含void foo(int a, int b);
,在这种情况下,您可以使用模板专业化,例如
template <typename T>
class C
{
private:
T t_;
int a_;
int b_;
public:
// called for general use
void foo()
{
t_.foo(a_);
}
};
// specialized version for T = B
template<>
void C<B>::foo()
{
t_.foo(a_, b_);
}