Nav*_*K N 6 c++ templates const-correctness traits
这个问题与我的最后一个问题有关.我正在尝试使用traits<T> 和解决问题 traits<T*>.请考虑以下代码.
template<typename T>
struct traits
{
typedef const T& const_reference;
};
template<typename T>
struct traits<T*>
{
typedef const T const_reference;
};
template<typename T>
class test
{
public:
typedef typename traits<T>::const_reference const_reference;
test() {}
const_reference value() const {
return f;
}
private:
T f;
};
int main()
{
const test<foo*> t;
const foo* f = t.value(); // error here. cannot convert ‘const foo’ to ‘const foo*’ in initialization
return 0;
}
Run Code Online (Sandbox Code Playgroud)
所以它看起来像编译器不考虑指针性状专业化,并采取返回类型value()为const foo,而不是const foo*.我在这做错了什么?
任何帮助都会很棒!
正在使用该专业。traits<foo*>::const_reference 是 const foo。如果你希望它是一个指针,请使用:
template<typename T>
struct traits<T*>
{
typedef const T* const_reference;
};
Run Code Online (Sandbox Code Playgroud)
有了这个,traits<foo*>::const_reference就会const foo*。
T请注意,专业化中的使用traits<T*>与模板中的 T 完全分开traits。你可以重命名它:
template<typename U>
struct traits<U*>
{
typedef const U* const_reference;
};
Run Code Online (Sandbox Code Playgroud)
并且您将拥有相同的专业。如果您有函数式编程经验,这会更有意义。
首先,将其视为template <typename ...>引入抽象,就像函数抽象出值一样。就像转身一样
sum = 0
for item in [1,2,3]:
sum += item
Run Code Online (Sandbox Code Playgroud)
进入:
function sum(l):
sum = 0
for item in l:
sum += item
return sum
Run Code Online (Sandbox Code Playgroud)
其中l代替[1,2,3]. 我们可以sums从另一个函数调用,该函数本身有一个名为 的形式参数l:
function sumsq(l):
return sum(map(lambda x: x*x, l))
Run Code Online (Sandbox Code Playgroud)
sumsqsum的“l”与“l”无关。
使用模板,我们抽象类型名称而不是值。也就是说,我们转:
struct traits {
typedef const double& const_reference;
};
Run Code Online (Sandbox Code Playgroud)
进入:
template <typename T>
struct traits {
typedef const T& const_reference;
};
Run Code Online (Sandbox Code Playgroud)
现在考虑非模板专业化:
template <>
struct traits<double*> {
typedef const double* const_reference;
};
Run Code Online (Sandbox Code Playgroud)
这里没有用于专门化的模板参数,但您可以认为将模板traits<double*>应用于. 抽象出来,你有:traitsdouble*double
template <typename T>
struct traits<T*> {
typedef const T* const_reference;
};
Run Code Online (Sandbox Code Playgroud)
这里T是专门化的参数,而不是基本模板。
| 归档时间: |
|
| 查看次数: |
2277 次 |
| 最近记录: |