我正在尝试使用类似“Modern C ++ Design”中的类型特征,使用模板来确定类型是否具有可变大小。例如字符串需要可变大小的存储,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 };
};
答案 0 :(得分:4)
您无法在外部类定义中添加嵌套类的特化。但是,使内部特征类成为一个单独的实体会更简单,更可重用:
#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;
// ...
};
如果您愿意,可以将各个特征类包装到detail
命名空间中。
答案 1 :(得分:3)
2003 C ++标准仅允许在封闭类定义之外的成员模板专门化。此外,定义外特化必须是封闭模板的显式完全特化。在这方面,Microsoft 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 };
};
答案 2 :(得分:0)
将函数专门化移到类之外和.cpp文件中,它不适用于标题。