模板推导需要用户定义的隐式转换的场景

时间:2018-06-10 17:43:12

标签: c++ templates operator-overloading implicit-conversion template-deduction

我有一个类模板,其中包含一个重载的运算符模板和一个隐式转换构造函数,类似于以下内容:

#include <utility>

template <class A, class B>
class X {
public:
    A a;
    B b;

    X(A a, B b) : a(a), b(b) {}
    X(std::pair<A, B> &value) : a(value.first), b(value.second) {}

    template <class C>
    friend X<A, C> operator+(const X<A, B> &left, const X<B, C> &right) {
        return X<A, C>(left.a, right.b);
    }
};

int main() {
    X<int, int> a(1, 2);
    X<int, float> b(1, 2.5f);
    std::pair<int, float> c(1, 2.5f);

    a + b; // Valid
    a + c; // Template deduction error
}

我在另一个问题上找到this回答,但我在这里看不到任何实现该解决方案的方法。 (注意,第一个参数的第二个模板参数和第二个参数的第一个模板参数是相同的很重要,实际的运算符实现不是那么简单,但接口是相同的。

1 个答案:

答案 0 :(得分:1)

@ R-Sahu和你引用的link已经回答了你的问题。但是解决方案是为C之后的非X类型提供另一个运算符+,这些类型在转换C之后进行转换,

tickers = c("AAA", "BAA", "TB3MS")

###HÄMTAR DATA###
library(quantmod)
var = noquote(tickers)
getSymbols(tickers, src = "FRED")

#kontrollera längderna och skapa en vector med längderna
vector = c()
for (v in 1:length(var)) {
    vector[v] = length(get(var[v]))
}
minsta = min(vector)
längsta = max(vector)

emptym = matrix( nrow = längsta, ncol = length(tickers)+1)

for (i in 1:length(var)) {
    emptym[,i] = get(var[i])
}

Demo