如何访问同一特征 C++ 的不同特征专业化?
How to access different traits specialization of the same trait C++?
我正面临这个让我抓狂的问题。
我有一个模板化结构可以提供部分专业化:
template <typename ReturnType>
struct field {
template <typename MessateType>
inline static ReturnType get(MessateType const& message, int const field) {
static_assert(false, "Missing trait specialization for the given type");
}
};
现在。如果我试图将它与不受支持的类型一起使用,我希望这个通用的让我知道。到目前为止一切顺利。
有了这个,我需要专门针对 int:
template <>
struct field<int> {
template <typename MessateType>
inline static int get(MessateType const& message, int const field) {
return std::atoi(message.getField(field).c_str());
}
};
现在,除了为简洁起见而删除的一些其他类型之外,我需要专门化它以提升:可选值。为此,我正在尝试以下代码:
template <typename T>
struct field<optional<T>> {
template <typename MessateType>
inline static optional<T> get(MessateType const& message, int const field) {
return message.isSetField(field) ? field<T>::get(message, field)
: optional<T>(boost::none);
}
};
但是,我在编译器上遇到以下错误:
error C2275: 'T': illegal use of this type as an expression
error C2039: 'get': is not a member of '`global namespace''
我一直在寻找解决这个问题的方法,但找不到。
看起来编译器不喜欢我试图从另一个特征 (optional<int>
) 访问其中一个特征 (int
) 的事实。
T.C. 的评论 "Rename your second function parameter." 是解决方案:
我改成了:
template <typename T>
struct field<optional<T>> {
template <typename MessateType>
inline static optional<T> get(MessateType const& message, int const field_id) {
return message.isSetField(field_id) ? field<T>::get(message, field_id)
: optional<T>(boost::none);
}
};
效果很好。
非常感谢!
我正面临这个让我抓狂的问题。 我有一个模板化结构可以提供部分专业化:
template <typename ReturnType>
struct field {
template <typename MessateType>
inline static ReturnType get(MessateType const& message, int const field) {
static_assert(false, "Missing trait specialization for the given type");
}
};
现在。如果我试图将它与不受支持的类型一起使用,我希望这个通用的让我知道。到目前为止一切顺利。
有了这个,我需要专门针对 int:
template <>
struct field<int> {
template <typename MessateType>
inline static int get(MessateType const& message, int const field) {
return std::atoi(message.getField(field).c_str());
}
};
现在,除了为简洁起见而删除的一些其他类型之外,我需要专门化它以提升:可选值。为此,我正在尝试以下代码:
template <typename T>
struct field<optional<T>> {
template <typename MessateType>
inline static optional<T> get(MessateType const& message, int const field) {
return message.isSetField(field) ? field<T>::get(message, field)
: optional<T>(boost::none);
}
};
但是,我在编译器上遇到以下错误:
error C2275: 'T': illegal use of this type as an expression
error C2039: 'get': is not a member of '`global namespace''
我一直在寻找解决这个问题的方法,但找不到。
看起来编译器不喜欢我试图从另一个特征 (optional<int>
) 访问其中一个特征 (int
) 的事实。
T.C. 的评论 "Rename your second function parameter." 是解决方案:
我改成了:
template <typename T>
struct field<optional<T>> {
template <typename MessateType>
inline static optional<T> get(MessateType const& message, int const field_id) {
return message.isSetField(field_id) ? field<T>::get(message, field_id)
: optional<T>(boost::none);
}
};
效果很好。 非常感谢!