我在制定嵌套部分模板专业化的语法时遇到了麻烦。无论如何,我认为这是正确的表达方式。我想要的是一个as()
返回转换值的函数。在大多数情况下static_cast
都可以正常工作,所以我有一个通用版本可以做到这一点,但在某些情况下我想具体一点。我遇到的麻烦是当尝试返回两个相似的模板类类型时,使用一个常见的typename
.
template<typename ClassType>
class Generic
{
public:
// Constructors/etc excluded
template<typename CastType>
CastType as() const;
private:
ClassType m_value;
};
// Templated version:
template<typename ClassType> template<typename CastType> inline
CastType Generic<ClassType>::as<CastType>() const
{
return static_cast<CastType>(m_value);
}
这就是设置。实际上,我不是 100% 确定这是否是最好的方法,但它在 GCC 中编译并且似乎可以工作,所以......无论如何。现在我想专门研究另一种模板化的类型(在这种情况下,Eigen::Matrix<T,4,1>
-- 但std::vector
也可能及时使用,即从 astd::vector<T>
转换为 a std::list<T>
),它是部分模板化的:
template<> template<typename CastType> inline
CastType Generic<Eigen::Matrix<CastType,4,1> >::as<CastType>() const
{
return m_value[0];
}
这有道理吗?如果我采用不同大小的 Eigen::Matrix 并专门处理它们,那么稍微不同的版本呢?
template<> template<typename CastType> inline
Eigen::Matrix<CastType,3,1> Generic<Eigen::Matrix<CastType,4,1> >::as<Eigen::Matrix<CastType,3,1>() const
{
return Eigen::Matrix<CastType,3,1>( m_value[0], m_value[1], m_value[2] );
}
我知道上面的两个代码位不起作用,而且语法可能很糟糕,这就是我想要解决的问题。如果这是重复的,请原谅。我看了几个类似的问题,但似乎没有一个完全是关于这个的,或者我只是没有看到它。