c++ 98:根据成员的存在提供不同的函数实现
C++98: Provide different function implementations, depending on the existance of a member
Setup:存在一个类classA
和一个正在使用classA
的类classB
。不幸的是,在编程classB
时,我不知道classA
是否会有某个成员someMember
。根据这一点,classB
中的成员函数someFunction
应该以一种或另一种方式实现。由于一种方法是使用someMember
,因此在someMember
不是classA
的成员的情况下,不编译该函数实例很重要。
问题:除了宏/定义之外,c++ 98中最好的解决方案是什么?
兆瓦:
class classA
{
public:
// c'tor
classA()
{
//someMember = 3;
};
// does not have the member "someMember"
//int someMember;
};
class classB
{
public:
// only compile this function if "someMember" is a member of classB
int someFunction(classA a)
{
return a.someMember;
}
// ...and compile this one otherwise
int someFunction(classA a)
{
return 2;
}
};
// --- just to have an MWE: ---
#include<iostream>
int main()
{
classA a;
classB b;
cout << b.someFunction(a);
return 0;
}
由于您的问题被标记为templates
,我认为您的classB
实际上可以是一个类模板,或者至少可以使用一个…如果是这种情况,您可以应用SFINAE,例如使用以下解决方案:
#include <iostream>
#include <type_traits>
class classA
{
public:
// c'tor
classA()
{
someMember = 3;
};
// does not have the member "someMember"
int someMember;
};
template<class T, class = void>
class classB_impl
{
public:
// ...and compile this one otherwise
int someFunction(T)
{
return 2;
}
};
template <class T>
class classB_impl<T, decltype(std::declval<T>().someMember, void())> {
public:
// only compile this function if "someMember" is a member of classB
int someFunction(T a)
{
return a.someMember;
}
};
using classB = classB_impl<classA>;
int main() {
classB b;
std::cout << b.someFunction(classA{}) << std::endl;
}
(现场演示)在这种情况下(如果你正在使用c++98),你可能会更幸运地尝试使用额外的trait,例如:
#include <iostream>
class classA
{
public:
// c'tor
classA()
{
someMember = 3;
};
// does not have the member "someMember"
int someMember;
};
template <class T, int T::*V = &T::someMember>
struct someMemberTrait {
typedef void type;
};
template<class T, class = void>
class classB_impl
{
public:
// ...and compile this one otherwise
int someFunction(T)
{
return 2;
}
};
template <class T>
class classB_impl<T, typename someMemberTrait<T>::type> {
public:
// only compile this function if "someMember" is a member of classB
int someFunction(T a)
{
return a.someMember;
}
};
typedef classB_impl<classA> classB;
int main() {
classB b;
std::cout << b.someFunction(classA()) << std::endl;
}
(现场演示)相关文章:
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 分段 排序函数实现中的错误
- 无法去函数实现 vim
- C++ 20 中的运算符 == 和 <=> 应该作为成员还是自由函数实现?
- 为什么在这种情况下不调用我的虚拟函数实现?
- 我能否通过将函数实现为类对象方法来避免使用互斥锁
- 嵌套的模板结构构造函数实现
- C++接口的工厂函数实现
- 链表中的递归长度函数实现
- 我可以期望某些 STL 函数实现是可自动矢量化的吗?
- 如何将深拷贝构造函数实现到链表中?
- 虚拟 CTOR 的克隆函数实现是否有问题
- 没有捕获列表的 lambda 通常作为普通函数实现吗?
- C++二叉树打印函数实现
- C++:默认构造函数实现
- C++派生类中的纯虚函数实现
- 决定放置函数实现的位置
- 强制实施纯虚函数实现,可能使用不同的参数类型
- 如何让成员函数实现依赖于类的模板参数?
- 我们如何将Ostream函数作为类的成员函数实现,而不是作为朋友函数,以便我可以用作虚拟函数