我经常使用代码示例中显示的模板类来组成新类型,这些类型阻止我以错误的顺序传递错误的参数,参数并记录参数的含义。请参阅代码示例中的数字(2)。
但是有一件事情有点令人讨厌:我不能将这个类用于引用类型(参见代码示例中的数字(3))。当然这不起作用,因为参考崩溃使我的构造者模棱两可,这就是为什么我禁用T&& amp;构造函数(请参阅代码示例中的数字(1))以使示例正常工作。但那是 - 我希望 - 只是第二个最好的解决方案?
问题:有没有办法使用StrongType类,在非引用类型的情况下保留两个构造函数,而不为引用类型创建类似StrongTypeRef的特殊类?
示例按原样编译。 要查看错误,请通过取消注释来启用数字(1)。
提前谢谢!#include <iostream>
template <typename T, typename Parameter>
class StrongType
{
public:
explicit StrongType(T const& value) : value_(value) {}
// (1) explicit StrongType(T&& value) : value_(value) {}
T& get() { return value_; }
T const& get() const {return value_; }
private:
T value_;
};
// (2) works great
using Iteration = StrongType<int, struct IterationType>;
// (3) Not o.k.
using IterationRef = StrongType<int&, struct IterationRefType>;
void do_something1(Iteration k)
{
std::cout << k.get();
}
void do_something2(IterationRef k)
{
k.get() = 42;
}
int main(int argc, const char * argv[]) {
Iteration it1(5);
do_something1(it1);
int refed = 0;
IterationRef it2(refed);
do_something2(it2);
return 0;
}
答案 0 :(得分:2)
一种可能的解决方案是简单地专门化它。只需添加一个没有模糊构造函数的特化:
template <typename T, typename Parameter>
class StrongType<T &, Parameter>
{
public:
explicit StrongType(T const& value) : value_(value) {}
T& get() { return value_; }
T const& get() const {return value_; }
private:
T value_;
};
这将修复编译错误,而不是正式创建并且必须基于模板参数使用不同的模板。这正是专业化的目的。但是,这可能会或可能不会解决您的所有问题。例如,专精化的value_
班级成员将 不 作为参考。这可能是也可能不是你想要发生的事情。必要时调整。
但是您的查询仅限于解决编译错误,因此就是这样。这种蛮力解决方案适用于小型,简单的类。如果基本模板更复杂,那么简单的专业化当然会产生一些代码膨胀。在这种情况下,需要进行一些重构。
答案 1 :(得分:2)
如果您使用完美转发,那么它可以工作:
Sub Generate_Images()
Dim wK As Worksheet
Dim oCht As Chart
Dim i As Long, fI As Long
Dim fName As String
Application.DisplayAlerts = False
Set wK = ActiveSheet
fI = wK.Range("A" & wK.Rows.Count).End(xlUp).Row
wK.Columns("B:B").ColumnWidth = wK.Columns("A:A").ColumnWidth
For i = 1 To fI
wK.Range("A" & i).CopyPicture xlScreen, xlBitmap
wK.Paste
With wK.Pictures(wK.Pictures.Count)
.Left = wK.Range("B" & i).Left
.Top = wK.Range("B" & i).Top
.Placement = 1
.PrintObject = True
End With
Application.Wait Now + TimeValue("00:00:01")
Next i
Application.DisplayAlerts = True
End Sub