c++在不创建新对象的情况下获取类成员的默认值
C++ get default value of class member without creating new object
让我们考虑一下定义:
struct ClassWithMember
{
int myIntMember = 10;
}
我希望获得myIntMember
的默认值,但不要创建类的另一个实例
// IMPOSSIBLE int myInt = ClassWithMember::myIntMember;
// MUST AVOID int myInt = ClassWithMember().myIntMember;
我知道变通办法,但不喜欢它:
struct ClassWithMember
{
static const int myIntMember_DEFAULT = 10;
int myIntMember = myIntMember_DEFAULT;
}
int myInt = ClassWithMember::myIntMember_DEFAULT;
因为需要额外的行。我不能像static const int *const INTEGER11_DEFAULT = 0x100088855;
那样定义内联静态指针,这样的指针必须在.cpp
文件中定义,在.hpp
中只是声明。我的许多类都是头文件,所以为这个值创建多余的.cpp
不是一个好主意。
这里是c#
我想,对你来说,这只是另一种变通方法,但我认为这更实用一点。
如果您将默认值保存为静态方法返回的静态const,则可以避免在cpp文件中添加额外的行。
下面的例子在模板包装器中完成了这个技巧(使用默认值作为模板参数,默认值为;只是为了好玩),但模板部分只是为了避免示例
中的代码重复。#include <iostream>
template <typename T, T defTpl = T{}>
struct wrapperWithDef
{
static T getDefVal ()
{ static T const def { defTpl }; return def; }
T myTMember { getDefVal() };
};
int main()
{
wrapperWithDef<int> wi;
wrapperWithDef<long, 3L> wl;
wrapperWithDef<int *> wp;
// print "0, 3, (nil)" (clang++) or "0, 3, 0" (g++)
std::cout << wi.myTMember << ", " << wl.myTMember << ", "
<< wp.myTMember << std::endl;
// print "5, (nil), 1" (clang++) or "5, 0, 1" (g++)
std::cout << wrapperWithDef<unsigned, 5U>::getDefVal() << ", "
<< wrapperWithDef<long *>::getDefVal() << ", "
<< wrapperWithDef<bool, true>::getDefVal() << std::endl;
return 0;
}
我把这个解决方案叫做workaround
struct ClassWithMember
{
static const int myIntMember_DEFAULT = 10;
int myIntMember = myIntMember_DEFAULT;
}
int myInt = ClassWithMember::myIntMember_DEFAULT;
对于指针,它看起来更复杂
//.hpp
struct ClassWithMember
{
static AnotherClass* const myMember_DEFAULT; //=X; Assignment not allowed
AnotherClass* myMember = myMember_DEFAULT;
}
//.cpp
AnotherClass* const MyNamespace::ClassWithMember::myMember_DEFAULT = pAnotherInstance;
//usage
auto *my = ClassWithMember::myMember_DEFAULT;
相关文章:
- 如何在没有实例的情况下获取非静态方法的类型?
- 如何在不等待检索的情况下获取C++中的内存位置?
- 如何在不为其声明变量的情况下获取和使用常量值的地址?
- 在不使用模板的情况下获取 std::array 引用
- 在确定有实现的情况下获取HTTP 501未实现
- 如何将左值传递给函数,仅在没有模板的情况下获取右值
- 如何在不创建实例的情况下获取类的方法成员的类型?
- 如何在不包含 Windows.h 的情况下获取 IsDebuggerPresent 的声明
- <int> 在不破坏堆栈的情况下获取 C++ 中的堆栈总和
- 如何在不引起实例化的情况下获取功能模板的签名
- 如何在不定义其他 fonction getValue() 的情况下获取私有值
- 如何在不获取所有html的情况下获取QTextEdit的html标签?
- 在不发送任何内容的情况下获取功能的返回
- LDAP函数中是否有任何功能可以在不使用ldap_search的情况下获取用户信息
- 如何在不使用QMediaPlayer的情况下获取Qt中音频和视频文件的持续时间
- 我可以在不声明变量类型的情况下获取输入,或者在 c++ 中为同一变量声明多个类型吗?
- 处理POSIX信号:如何在不使用BackTrace_symbols的情况下获取堆栈跟踪
- 在不知道的情况下获取地图的钥匙
- 在不暂停贪吃蛇游戏的情况下获取输入
- 修复错误:在不更改代码的情况下获取临时地址