当我说&#34;属性&#34;时,我的意思是std:array<int, 5> arr
。 5
是数组的一个属性。
这是一个激励性的例子:假设我想创建一个包含格式信息的数字或字符串。所以我可能希望能够写Double<7,2> foo
,这意味着我希望foo成为一个双倍,当我打印它时,它的宽度为7,精度为2.我可以用通常的方式进行赋值:
foo = 42;
double bar = foo;
有办法做到这一点吗?
你可能会问我为什么要这样做。例如,为什么不在其构造函数中定义一个采用宽度和精度的类?答案是我不认为你可以在结构中使用它们。例如,我希望能够做到这样的事情:
struct Account {
std::string description;
Double<7, 2> amount;
Double<7, 2> balance;
Double<9, 3> percent;
};
答案 0 :(得分:3)
您可以使用非类型模板参数和double
隐式转换编写自己的包装类。优点是这类课程的规模保持不变。
#include <iostream>
template<std::streamsize WIDTH, std::streamsize PRECISION>
struct DoubleEx
{
double value;
DoubleEx(double fValue) : value(fValue) {}
operator double() const { return value; }
friend std::ostream& operator << (std::ostream& stream, const DoubleEx &val)
{
stream.width(WIDTH);
auto oldPrecision = stream.precision();
stream.precision(PRECISION);
stream << val.value;
stream.precision(oldPrecision);
return stream;
}
};
int main()
{
DoubleEx<15, 8> num1 = 123.45678;
double num2 = num1;
auto num3 = num1;
std::cout << "num1 = " << num1 << " size=" << sizeof(num1) << std::endl;
std::cout << "num2 = " << num2 << " size=" << sizeof(num2) << std::endl;
std::cout << "num3 = " << num3 << " size=" << sizeof(num3) << std::endl;
}
输出:
num1 = 123.45678 size=8
num2 = 123.457 size=8
num3 = 123.45678 size=8
答案 1 :(得分:1)
不确定我的意思是什么,但也许mixins可以帮到你 作为一个最小的工作示例:
#include <cstddef>
#include <string>
template<std::size_t N, std::size_t M>
struct Double {
operator double() { return N*M; }
};
struct Description {
std::string description;
};
template<typename ...T>
struct Mock: T... { };
using Account = Mock<Double<7, 2>, Description>;
int main() {
Account account;
account.description = "foo";
double d = account;
}