2016-09-26 69 views
1

当我说“属性”时,我的意思是沿着std:array<int, 5> arr的方向。 5是该数组的一个属性。我可以在C++中创建“属性”类型吗?

这是一个激励性的例子:假设我想创建一个包含格式信息的数字或字符串。所以我可能希望能写Double<7,2> foo,这意味着我希望foo是一个double,当我打印它时,它的宽度为7,精度为2.我可以按照常规方式进行分配:

foo = 42; 
double bar = foo; 

有没有办法做到这一点?

你可能会问为什么我想这样做。为什么不,例如,定义一个在构造函数中使用宽度和精度的类?答案是我认为你不能在结构中使用它们。举例来说,我希望能够做一些事情,如:

struct Account { 
    std::string description; 
    Double<7, 2> amount; 
    Double<7, 2> balance; 
    Double<9, 3> percent; 
}; 
+3

你问[非类型模板参数(http://en.cppreference.com/w/cpp/language/template_parameters#Non-type_template_parameter)? –

+1

'5'是*模板参数*。这个概念已经有了一个名字:-) –

+1

'template struct Double {};',这是一个赋值的重载,适当的转换运算符将允许你以你拥有的方式使用'Double'这个问题。 – Bathsheba

回答

1

不知道我得到了你的意思,但也许混入可以帮助你。
作为最小的,工作示例:

#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; 
} 
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 
+0

@ildjarn谢谢为了指出这一点 –

相关问题