模板类默认类型和条件
template class default type and condition
>我想对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
}
您可以添加static_assert
来执行检查。
template <typename T=std::conditional_t<sizeof(void*) == 8, std::uint64_t, std::uint32_t>>
class MyClass
{
static_assert(std::is_same_v<T, std::uint64_t> || std::is_same_v<T, std::uint32_t>, "T must be std::uint64_t or std::uint32_t");
private:
std::vector<T> vs;
public:
// ...
};
住
松亚耀提出的解决方案static_assert
很好,完全有效,并且比我在下面建议的要短。还。。。
建议另一种选择,让编译器检查您而无需static_assert
:
template <typename T>
class MyClassBase {
std::vector<T> vs;
public:
// ...
};
template <typename T =
std::conditional_t<sizeof(void*) == 8, std::uint64_t, std::uint32_t>>
class MyClass;
template <>
class MyClass<std::uint64_t>: public MyClassBase<std::uint64_t> {};
template <>
class MyClass<std::uint32_t>: public MyClassBase<std::uint32_t> {};
http://coliru.stacked-crooked.com/a/66033e773f001379
相关文章:
- 具有条件类型名的模板类
- 模板类默认类型和条件
- 根据模板类型有条件地删除变量
- 有条件地选择带有 decltype() 和三元运算符的类型
- 对于检查 >=0 终止条件时的循环索引类型
- 如果条件取决于模板类型并且在编译时已知,是否可以保证C++编译器不会生成分支?
- 在非本机类型上具有多个条件的 GDB 断点
- 用于根据条件选择编译时类型的可变参数模板
- 使用 std::条件根据模板参数选择成员类型
- GNU Radio中基于条件的输出的块类型
- 如何编译模板类型名的时条件
- 基于指针或值类型的条件类型
- 有没有一种很好的方法来实现具有默认失败情况的条件类型?
- C++:无法使用条件类型在模板函数中使用 'double' 类型的 lvalue 初始化 'char*' 类型的参数
- 条件类型声明
- C++正在传输运行时条件类型信息
- 条件类型特征通用引用的问题
- 条件类型别名定义
- 在.cpp文件中使用条件类型
- 条件类型定义在C++中可能吗?