【发布时间】:2016-04-11 12:27:04
【问题描述】:
请考虑以下代码sn-p:
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_expressions,那么让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_expressions 不会发生。但是,(将其作为次要问题)我应该将class = std::enable_if_t<is_vector_expression_v<E1> || is_vector_expression_v<E2>> 添加到vector_binary_operation 的模板参数列表中吗?
主要问题是:如何定义size_type 如上所述?
【问题讨论】:
标签: c++ templates c++14 typetraits