請考慮下面的代碼片斷之間的二進制運算的結果:確定正確的尺寸類型兩個向量類型或一個向量類型以及標量型
template<class E>
class vector_expression {};
template<class Tuple>
class vector
: public vector_expression<vector<Tuple>>
{
public:
using value_type = typename Tuple::value_type;
using size_type = typename Tuple::size_type;
};
namespace detail
{
template<class E>
constexpr bool is_vector_expression_v = std::is_base_of_v<vector_expression<std::decay_t<E>>, std::decay_t<E>>;
template<class E, class = void>
struct value_type { using type = std::decay_t<E>; };
template<class E>
struct value_type<E, std::enable_if_t<is_vector_expression_v<E>>> { using type = typename std::decay_t<E>::value_type; };
template<class E>
using value_type_t = typename value_type<E>::type;
template<class E1, class E2, class BinaryOperation>
class vector_binary_operation
{
public:
using value_type = std::result_of_t<BinaryOperation(value_type_t<E1>, value_type_t<E2>)>;
};
}
E1
和E2
可能是任一類型的衍生vector_expression
或用作vector
的value_type
的任何類型。
需要謹慎選擇與vector_binary_operation
的結果對應的vector
類型。它很有意義,它的value_type
等於被調用的BinaryOperation
的結果類型。
但是,正確的size_type
很難推斷。這是我想做的事:
- 如果
E1
和E2
是vector_expression
S,然後讓size_type = std::conditional_t< std::numeric_limits<typename std::decay_t<E1>::size_type>::max() < std::numeric_limits<typename std::decay_t<E2>::size_type>::max(), typename std::decay_t<E1>::size_type, typename std::decay_t<E2>::size_type>>>;
- 如果
E1
或E2
(比如E1
)不是vector_expression
,然後讓size_type = typename std::decay_t<E2>::size_type
它將不會發生E1
和E2
都不是vector_expression
s。但是,(作爲第二個問題)我應該添加一個class = std::enable_if_t<is_vector_expression_v<E1> || is_vector_expression_v<E2>>
到模板參數列表vector_binary_operation
?
主要問題是:如何定義size_type
如上所述?
'value_type :: size_type'聽起來有些奇怪,因爲'value_type'和'size_type'是鬆散相關的。所以,我認爲最好使用一個新的結構體'size_type',並且使用'type'和'max'成員。不過,非常感謝您的回答! – 0xbadf00d
專業化中的'size'應該有'size_type'類型。[* std :: size_t可以存儲任何類型的理論上可能的對象的最大尺寸*](http://en.cppreference.com/w/cpp/types/size_t),但是這個語句與'sizeof '操作員。發生在vector中的'size_type'可能是一些抽象的複雜事物。雖然這是不尋常的,不太可能,但代碼也應該適用於這種情況。 – 0xbadf00d
@ 0xbadf00d:重命名爲'vector_trait_helper',它可能在一個'struct'中都有意義,但我同意我應該改名,或者創建另一個'struct'。 – Jarod42