具有依赖名称(类型名称)的部分专用化
partial specialization with dependent name (typename)
我有以下简单的strinToTypeImpl
函数,可以将任何类型的字符串转换为模板类型。我担心的问题是编译器告诉我typename MyMatrix<T>::Vector3
的部分特化:
模板参数 T 未用于部分专用化
我不能在专用化中使用从属名称吗?
namespace details
{
template<typename T>
struct stringToTypeImpl{
bool operator()(T& t, const std::string& s)
{
std::istringstream iss(s);
return !(iss >> t).fail();
}
};
template<typename T>
struct stringToTypeImpl< typename MyMatrix<T>::Vector3 >{
// Replacing typename MyMatrix<T>::Vector3 by
// Eigen::Matrix<T,3,1> WORKS but why?
bool operator()(typename MyMatrix<PREC>::Vector3 & t, const std::string& s)
{
stringToVector3<PREC>(t,s);
}
};
}
这只是已经
讨论过多次的问题的另一种形式:从类型X
到类型T
没有一对一的映射,以至于MyMatrix<T>::Vector3 == X
。
简单的例子:
MyMatrix<double> { typedef Vector3 int; };
MyMatrix<float> { typedef Vector3 int; };
stringToTypeImpl<int> // Help, what is "T"?
Kerreck 的回答和我在那里的评论解释了这个问题。类型系统无法将成员映射到成员的父级,因此::
运算符停止需要匹配T
的推导过程。
解决方案的简单方法是将Vector3
引入外部并将其专用于矩阵类型,然后将成员MyMatrix< T >::Vector3
typedef
template< typename Matrix >
struct Vector3 {
typename Matrix::ValueType x, y, z;
};
template< typename T >
struct MyMatrix {
typedef Vector3< MyMatrix > Vector3;
};
StringToTypeImpl
的部分专用化需要针对最终模板类型,而不是 typedef。部分专用化不能跨一组 typedef 匹配,尽管专用化可以将类型与由单个 typedef 名称别名的类型匹配。
相关文章:
- 通过依赖类型使用非类型模板参数的单类型模板参数类模板的部分专用化
- 在 C++20 中是否不再允许在 std 中对程序定义类型的函数模板进行专用化?
- 为什么依赖模板类型在部分专用化中不可推导?
- 具有可变参数非类型参数的模板专用化
- 检查子类型时的专用方法模板
- 特定类型的模板函数的专用化
- 将"模板<类型名 T>zero()"扩展/专用为可调用的"T"
- 模板专用化和明确指定返回类型与自动
- 将返回类型专用化为 void 或 const 左值引用
- 专用于类型集的函数模板
- 有没有办法根据 lambda 参数返回类型部分专用化我的模板化函数?
- 为什么 std::optional::value_or 没有默认 ctor 类型的专用化?
- 具有模板专用化的泛型类型转换
- cpp 模板专用化,错误说参数 1 的类型为 T,这取决于参数 T
- 具有不同非类型模板参数的模板类部分专用化
- 从具有部分专用化的boost:hana::set中提取类型失败
- 带有void类型和参数的C++11模板专用化
- 常量和非常量类型的相同模板专用化
- 具有专用和非专用类型的模板重载
- 是否可以派生自和"respecialize"具有派生自专用类型的类型的专用类?