在下面的代码中,我正在为int值和Objects执行乘法变量模板。它适用于所有原始类型。它也适用于只有2个对象。但是当我使用多于2个参数对象进行乘法时,代码不会编译。
multiply(1, 2, 3, 4, 5, 6) //works correcyly
multiply( A(1), B(1)) //works correctly
multiply( A(1), B(1), B(1) ); //compile time Error
multiply( A(1), B(1), B(1), B(1) ); //compile time Error
如何解决超过2个对象乘法的问题?乘法以左关联方式完成。
#include <iostream>
#include <assert.h>
#include <cstddef>
#include <typeinfo>
#include <stdlib.h>
using namespace std;
template <typename...> struct MulTs;
template <typename T1> struct MulTs<T1> {
typedef T1 type;
};
template <typename T1, typename... Ts>
struct MulTs<T1, Ts...> {
static typename MulTs < Ts...>::type makeTs(); //a
static T1 makeT1(); //b
typedef decltype(makeT1() * makeTs()) type; //c
};
template <typename T>
T multiply(const T& v) {
return v;
}
template <typename T1, typename... Ts>
auto multiply(const T1& v1, const Ts&... rest) -> typename MulTs<T1, Ts...>::type //instead of the decltype
{
return v1 * multiply(rest...);
}
struct B;
struct A {
friend A operator*(const A &, const B &);
friend ostream & operator<<(ostream &os, const A &a);
A(int val = 0) : i(val) {}
private:
const int i;
};
struct B {
friend A operator*(const A &a, const B &b) {
return A(a.i * b.i);
}
B(int val = 0) : i(val) {}
private:
const int i;
};
ostream &operator<<(ostream &os, const A &a) {
return os << a.i;
}
int main() {
cout << multiply(1, 2, 3, 4, 5, 6) <<endl;//works correcyly
cout << multiply( A(1), B(1))<<endl; //works correctly
//cout << multiply( A(1), B(1), B(1) ); //compile time Error
}
答案 0 :(得分:2)
multiply( A(1), B(1), B(1) )
扩展到A(1) * multiply(B(1), B(1))
。由于您没有operator *(const B&, const B&)
重载,因此会出现编译错误。