我可以创建"归因于" C ++中的类型?

时间:2016-09-26 12:26:23

标签: c++ c++14

当我说&#34;属性&#34;时,我的意思是std:array<int, 5> arr5是数组的一个属性。

这是一个激励性的例子:假设我想创建一个包含格式信息的数字或字符串。所以我可能希望能够写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;
};

2 个答案:

答案 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;
}