直接或通过构造函数初始化类型的类
initialize class with same type directly or through constructor
我有此代码:
#include <iostream>
template <int mult>
struct A {
int v;
A (int p) {
v = p * mult;
}
};
int main (void) {
A<4> a (2); // initialize v = 2 * 4
A<4> b = {2}; // initialize v to 2
std::cout << a.v << " " << b.v << std::endl;
}
我想看" 8 2"。我得到的是" 8 8"。
我希望通过构造函数或通过其他某些方法避免构造函数来初始化V的方法。我已经研究了initializer_list或汇总初始化,但是我还没有找到解决方案。唯一的黑客是创建一个带有虚拟额外参数的新构造函数。
任何更好的方法?
首先,您应该更喜欢成员初始化列表,而不是在构造函数的主体中分配,即
A (int p): v(p * mult) {}
第二,如果这是一个XY问题,我建议您遵循其他答案并更改设计。正如Deidei在评论中指出的那样,界面现在尚不清楚。
如果您仍然坚持此设计,则可以继续阅读。
您可以使用以std::initializer_list
为参数的构造函数。当对象被列表至少化时,首先将考虑此类构造函数。例如:
#include <initializer_list>
template <int mult>
struct A {
int v;
A (int p): v(p * mult) {}
A (std::initializer_list<int> l) : v(*l.begin()) {}
};
缺陷是无法在编译时确定std::initializer_list
的大小,因此您必须接受大小大于1的列表初始化器或大小0的列表初始化器,这会导致表达式*l.begin()
中的不确定行为。
当然,您可以进行一些运行时检查,例如,
A (std::initializer_list<int> l) {
if (l.size() != 1) {
/* do something */
}
v = *l.begin();
}
但是,您必须遭受此支票造成的效率损失。
您可以保留一个私有构造函数,并使用静态方法来对待其参数不同:
template <int mult>
class A {
int v;
A (int p) {
v = p;
}
public:
static A<mult> constructor1(int p) {
return A<mult>(p);
}
static A<mult> constructor2(int p) {
return A<mult>(p * mult);
}
};
我发现最好的解决方案是为'int v'创建一个容器类。类似:
#include <iostream>
struct Ac {
int v;
};
template <int mult>
struct A : Ac {
A (Ac p) {
v = p.v;
}
A (int p) {
v = p * mult;
}
};
int main (void) {
A<4> a (2); // initialize v = 2 * 4
A<4> b = (Ac{2}); // initialize v to 2
std::cout << a.v << " " << b.v << std::endl;
}
相关文章:
- 无法使用类型 'const char *' 的左值初始化类型 'char *' 的成员子对象
- "const wchar_t *" 类型的值不能用于初始化类型 "const PWSTR" 的实体
- Visual Studio C++:不能使用类型为 "const wchar_t *" 的值来初始化类型为 "TCHAR *" 的实体
- 为什么我总是收到此错误:从类型为"农场动物"的右值初始化类型的非常量引用无效|
- 无法使用类型为"结构节点 *"的左值初始化类型为"结构节点 *"的参数
- C++ 解决方法:"从类型"B*"的表达式初始化类型"C*&"的引用无效"
- 零初始化类型
- 回调方法显示错误,类型为"void(*)"的值不能用于初始化类型的实体
- C++ 重载和覆盖 - 无法使用类型的右值初始化类型的参数
- 类型值不能用于初始化类型实体
- 无效初始化类型的 BinaryNode *& 的非常量引用
- 从类型 'Matrix&' 的右值初始化 类型的非 const 引用无效 'Matrix'
- 无法汇总初始化类型结构的变量,其中包含在类模板中的位字段成员
- 直接或通过构造函数初始化类型的类
- 无法使用 'Shape *' 类型的左值初始化类型 'Shape Shape::*' 的返回对象
- C++:从类型"int*"的表达式初始化类型"const int*&"的引用无效
- 从类型为"矩阵"的右值初始化类型为"矩阵"的非常量引用无效
- 无法使用类型 'const char [X]' 的左值初始化类型 'const signed char *' 的成员子对象
- C 我可以用双重初始化类型浮点的变量
- 无法识别初始化类型