由于参考折叠导致的模糊过载

时间:2017-09-09 20:33:27

标签: c++

我经常使用代码示例中显示的模板类来组成新类型,这些类型阻止我以错误的顺序传递错误的参数,参数并记录参数的含义。请参阅代码示例中的数字(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;
}

2 个答案:

答案 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

实例:http://coliru.stacked-crooked.com/a/a78cb4617961f3c9