类型特征-显式模板专门化.在xcode上失败
Type Traits - Explicit template specialization. fails on xcode
我试图使用类型特征,如"现代c++设计"使用模板来确定类型是否具有可变大小。例如,string类型需要可变大小的存储空间,int类型需要固定大小的存储空间。这段代码在Microsoft c++上工作,现在我移植到mac上,我得到错误:
显式专门化在当前作用域中是不允许的
专门化这个的正确方法是什么?
template <typename T>
class MyTypeTraits
{
template<class U> struct VariableLengthStorageTraits
{
enum { result = false };
};
template<> struct VariableLengthStorageTraits<std::wstring>
{
enum { result = true };
};
public:
enum{ IsVariableLengthType = VariableLengthStorageTraits<T>::result };
};
2003年的c++标准只允许在封闭类定义之外的成员模板特化。此外,定义外的专门化必须是封闭模板的显式完全专门化。微软c++在这方面是非标准的。修复方法很简单,只需将内部模板移出封闭模板,因为内部模板不需要其封闭类模板参数:
template<class U> struct VariableLengthStorageTraits
{
enum { result = false };
};
template<>
struct VariableLengthStorageTraits<std::wstring>
{
enum { result = true };
};
template <typename T>
struct MyTypeTraits
{
enum{ IsVariableLengthType = VariableLengthStorageTraits<T>::result };
};
不能在外部类定义中添加嵌套类的专门化。不过,让内部trait类成为一个单独的实体会更简单,也更容易重用:
#include <type_traits>
template <typename> struct has_variable_length; // intentionally undefined!
template <> struct has_variable_length<std::wstring> : std::true_type { };
template <> struct has_variable_length<int> : std::false_type { };
// ...
template <typename T> struct MyTraits
{
static const bool variable_length = has_variable_length<T>::value;
// ...
};
如果你愿意,你可以把单个的trait类包装成一个detail
命名空间。
将函数专门化移出类并放入.cpp文件中,它不适用于头文件
相关文章:
- ld:bind_at_load和-bitcode_bundle(Xcode设置ENABLE_bitcode=YES)不能
- 是否可以对零模板参数进行模板专门化
- 在没有Xcode的情况下在Mac捆绑包中嵌入框架
- 尝试根据类中 typedef 的存在来专门化模板函数
- Xcode 语义问题引用或以前定义的代码
- 使用 Xcode 将双精度存储在数组C++中
- 如何基于模板化类的基类专门化成员函数
- Xcode 9.4.1 中的 Apple Mach-O 链接器 (id) 错误
- 如何为指向复杂值的迭代器专门化算法?
- 专门化模板覆盖函数/避免对象切片
- 各种版本的 Mac OSX 向后兼容性如何?(Xcode C++
- 我能否根据其运算符()的签名专门化可变参数模板参数
- MacOS 上的 Xcode 11 项目不在一个函数中使用 sin 和 cos:未定义的符号"___sincosf_stret"
- macOS 是内置在 clang 编译器中还是内置于 xcode ide 中?
- Qt - 从XCode上传到MacOS AppStore
- 在 xcode 10 上找不到 stdlibc++ 标头错误
- cmake add_custom_command + Xcode:多输出 = 多命令调用
- 在 xcode 上使用 stdlib.h
- 我可以在没有Xcode的情况下在Mac上使用带有C++的虚幻引擎吗?
- 类型特征-显式模板专门化.在xcode上失败