2015-10-24 14 views
5

Nếu tôi có một cấu trúc chung/lớp:Làm thế nào để quảng cáo hai loại mẫu cho các hoạt động arithmitic như các loại nội trang?

template<typename T> 
struct Container 
{ 
    T value; 
    Container(const Value& value) : value(value) { } 
}; 

Và tôi muốn thực hiện một thao tác trên hai trong số họ:

template<typename T, typename U> 
Container<T> operator+(const Container<T>& lhs, const Container<U>& rhs) 
{ 
    return Container<T>(lhs.value + rhs.value); 
} 

Vấn đề là nếu lhs là loại Container<int>rhs thuộc loại Container<float>, sau đó tôi sẽ nhận lại Container<int>. Nhưng nếu tôi phải làm auto result = 2 + 2.0f, thì result sẽ thuộc loại float. Vì vậy, hành vi không nhất quán giữa các loại nội trang và các loại tùy chỉnh.

Vì vậy, làm cách nào tôi có thể bị quá tải operator+ và làm cho nó trở về Container<float>, giống như cách C++ xử lý quảng cáo số học với các loại nội trang?

+0

bạn có thể sử dụng C++ 11? –

+0

@PiotrSkotnicki Có. – Therhang

Trả lời

5

Theo như bạn sử dụng một trong hai loại mẫu, bạn có nguy cơ tạo ra một dàn diễn viên dựa trên kết quả của tổng. Ví dụ: nếu bạn vô tình chọn int làm loại mục tiêu của mình, mặc dù tổng kết quả trong một số float, số này sẽ được chuyển sang loại đã chọn.

Dù sao, bắt đầu với C++ 11, bạn con dựa vào decltype specifier như trong ví dụ trên (hoặc ít nhất, bạn có thể làm điều đó nếu Container::TContainer::U là một loại mà các nhà điều hành + được xác định).

Tôi cũng sử dụng thông số auto làm giá trị trả về cho số operator+, vì nó là lúc chúng tôi xử lý bắt đầu từ C++ 14 và thực sự hữu ích.

Nó sau các ví dụ làm việc nêu trên:

#include <iostream> 
#include <vector> 

template<typename T> 
struct Container 
{ 
    T value; 
    Container(const T& value) : value(value) { } 
}; 

template<typename T, typename U> 
auto operator+(const Container<T>& lhs, const Container<U>& rhs) 
{ 
    return Container<decltype(lhs.value+rhs.value)>{lhs.value + rhs.value}; 
} 

int main() 
{ 
    Container<int> c1{1}; 
    Container<float> c2{0.5}; 
    std::cout << (c1+c2).value << std::endl; 
} 
+1

Có vẻ tốt. Bạn có thể làm cho nó dễ đọc hơn với hàm trợ giúp 'make_container' cho phép đối số mẫu được suy luận:' return make_container (lhs.value + rhs.value); ' – hvd

+0

điểm tốt, tôi sẽ để nó làm bài tập về nhà ...: -) – skypjack

+0

Có bất kỳ chi phí thời gian chạy bổ sung nào được thực hiện bởi thao tác được thực hiện trong 'decltype' không? Nó sẽ tốt hơn nếu tôi lưu trữ kết quả trong một biến 'auto' tạm thời và chỉ làm một cái gì đó như' return Container (result); '? – Therhang

Các vấn đề liên quan