簡體   English   中英

產生算術運算結果類型的策略?

[英]Policy to produce the result type of an arithmetic operation?

考慮以下示例:

#include <iostream>
#include <string>

template <class Property>
struct MyClass
{
    double _data;
};

template <class Property>
inline MyClass<Property> operator+(const MyClass<Property> lhs,
                                   const MyClass<Property> rhs)
{
    return {lhs._data + rhs._data};
}

int main()
{
   MyClass<std::string> a{1.5};
   MyClass<std::string> b{2.5};
   MyClass<std::string> c = a + b;
   std::cout<<c._data<<std::endl;
   return 0;
}

它很簡單,沒有任何設計上的問題(至少我認為)。 現在考慮,我希望能夠為具有不同屬性類型的類生成一個operator+ (以及所有算術運算符)。 但是沒有確定MyClass<Property1> + MyClass<Property2>應該是MyClass<Property1>還是MyClass<Property2> :因此,好的選擇應該由用戶指定。 問題如下:如何重新設計類(或其他任何類)以使用戶提供轉換策略? (我的意思是說它將如何在標准庫或boost中進行設計?)

編輯:澄清一下,編譯器無法自動生成MyClass<Property1> + MyClass<Property2>的結果類型。 該策略應由用戶指定。 但是如何以一種干凈的方式設計它呢?

使用類型特征(正如Kerrek SB在他的評論中指出的那樣)。

template<typename T, typename U>
struct CommonPropertyTypeTraits : std::common_type<T,U>{}; //default version works if the types have a common type 

std :: common_type僅在類型可以隱式轉換時才起作用。 如果沒有可以隱式轉換的通用類型,或者用戶想要其他類型,則可以專門使用CommonPropertyTypeTraits:

template<>
struct CommonPropertyTypeTraits<MyType,MyOtherType> {
    using type = SomeType;
} 

函數的主體將是:

template <class Property1, class Property2>
inline MyClass<typename CommonPropertyTypeTraits<Property1,Property2>::type> operator+(const MyClass<Property1> lhs, const MyClass<Property2> rhs)
{
    return {lhs._data + rhs._data};
}

注意,如果沒有隱式可轉換的通用類型並且用戶沒有專門化traits模板,這將帶來一個非常丑陋的錯誤。 可以進行SFINAE測試以得出更好的錯誤:

template <class Property1, class Property2, typename=typename CommonPropertyTypeTraits<Property1,Property2>::type>
inline MyClass<typename CommonPropertyTypeTraits<Property1,Property2>::type> operator+(const MyClass<Property1> lhs, const MyClass<Property2> rhs)
{
    return {lhs._data + rhs._data};
}

我仍然不確定您最終想使用它做什么。 如果用於尺寸分析(即在編譯時跟蹤不同單位系統的類型並進行必要的轉換並發出必要的錯誤),請查看boost.Unit。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM