我有一个类模板,其转换构造函数为模板类型。并且该函数接受该类模板的两个参数。我引用了这个question/answer来允许函数使用转换构造函数,但是答案表明只有在显式构造了至少一个参数时才能调用该函数。是否有其他方法允许使用隐式构造的所有参数调用函数?
所以这就是我在提到所提到的链接之后所拥有的。如果至少参数lhs或rhs显式为X类型,并且我希望它们都工作,即使两者都是T类型,也可以这样做。
template<typename T>
class X {
public:
X(T t) {}
friend void func(X lhs, X rhs) {}
};
答案 0 :(得分:1)
如果我正确理解您的问题,您可以添加重载:
template<typename T>
class X {
public:
X(T t) {}
friend void func(const X& lhs, const X& rhs) {}
};
template <typename T> X<T> asX(const T& t) { return {t}; }
template <typename T> const X<T>& asX(const X<T>& x) { return x; }
template<typename LHS, typename RHS>
void func(const LHS& lhs, const RHS& rhs) { return func(asX(lhs), asX(rhs)); }