C ++ 11的方式来写模板采摘更大的整数类型?(C++11 way to write templa

2019-09-22 23:33发布

在C ++ 11中的模板函数,它2个模板参数,这两者必须是无符号整数类型编译时间,我想有一个局部变量具有取两个模板参数的具有多个位的类型。 在C ++ 03我可能会写类似:

template<bool, class T, class U>
struct pick_first;

template<class T, class U>
struct pick_first<true, T, U> {
    typedef T type;
};

template<class T, class U>
struct pick_first<false, T, U> {
    typedef U type;
};

template<class T, class U>
struct pick_bigger {
    typedef typename pick_first<(sizeof(T) >= sizeof(U)), T, U>::type type;
};

// usage
template<class uintX_t, class uintY_t>
void foo() {
    typename pick_bigger<uintX_t, uintY_t>::type mylocal = 0;
    // insert doing stuff with mylocal here
}

我可以利用任何新的C ++ 11层的功能,使这个更简单? 我知道我可以使用可变参数模板,使其与不仅仅是对类型的更多工作,而不是使用pick_first我可以写很多专业化的,以使其与新int_leastX_t和int_fastX_t工种。 但我很好奇,如果有只是为了这一个普通的更好的方法。 也许在某种程度上利用自动/ constexpr / decltype?

Answer 1:

你pick_first只是的std ::有条件在C ++ 11,所以你可以写

template<class T, class U>
struct wider {
    using type = typename std::conditional<sizeof(T) >= sizeof(U), T, U>::type; // I'm using the C++11 type alias feature 1) to educate people about them and 2) because I like them better than typedefs.
};

如果你只是想适合举办涉及两种类型的一些表达式的结果类型,不一定需要完全两种类型之一,那么std::common_type ,或者是auto ,是最好的解决办法:

template<class uintX_t, class uintY_t>
void foo() {
    typename std::common_type<uintX_t, uintY_t>::type mylocal = 0;
    // insert doing stuff with mylocal here
}

// or
template<class uintX_t, class uintY_t>
void foo(uintX_t x, uintY_t y) {
    auto mylocal = x + y;
}

和您的pick_bigger的实施缺少typename中有: typedef typename pick_first<(sizeof(T) >= sizeof(U)), T, U>::type type;



Answer 2:

由于这两种类型都是无符号的,只是decltype( T1() + T2() )



文章来源: C++11 way to write template for picking bigger integer type?