2016-09-26 68 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謝謝爲了指出這一點 –

相關問題