我想在MyClass中使用std :: enable_if,以仅接受(uint32_t | uint64_t)类型,同时如果用户未提供任何类型,则根据下面的条件选择默认类型。
但我无法使其正常工作。(C ++ 17)
#include <vector>
#include <cstdint>
template <typename T=std::conditional_t<sizeof(void*) == 8, std::uint64_t, std::uint32_t>>
class MyClass
{
private:
std::vector<T> vs;
public:
// ...
};
int main(){
MyClass a; // OK, the defaut type is used either uint32_t or uint64_t
MyClass<std::uint32_t> b; // Ok, use the user provided type
MyClass<long> c; // must not compile, T is not one of uint32_t, uint64_t
}
sizeof(void*) == sizeof(uint64_t)
。虽然罕见,但一些专用机器即使今天仍然具有CHAR_BIT == 16
... - Aconcaguastd::is_integral<T> && std::is_unsigned<T>
这样的方式更可取?std::uintptr_t
可以作为一个很好的默认值,如果系统/编译器提供了128位无符号整数,用户甚至可以使用它... - Aconcagua