【发布时间】:2017-08-15 19:56:12
【问题描述】:
我正在编写一个包装器模板类,它可以包装任意类型并为其注入一些额外的语义,但我不知道如何让重载解决方案正常工作。当通常通过比较竞争转换序列的等级来解决的转换无法由编译器推断时,就会出现问题,因为所讨论的类型是模板参数,而不是函数参数。例如,
#include <type_traits>
template <typename T> class Wrapper {
T val;
public:
Wrapper() = default;
template <typename U> Wrapper(Wrapper<U> x) : val(x.val) {}
};
void foo(Wrapper<const char *>) {}
void foo(Wrapper<bool>) {}
int main() {
Wrapper<char *> cp;
foo(cp);
}
这里,对 foo() 的调用是模棱两可的。期望的行为是编译器选择void foo(Wrapper<const char *>),就像cp 代替char * 和foo 代替void foo(const char *) 一样。这可能吗?
编辑:感谢大家的快速回复,但也许我应该更清楚。我上面给出的只是一个例子。我需要的是对以下问题的一般解决方案:给定任意类型 T、U 和 V,假设 C++ 的内置重载决议更喜欢转换 T -> U 而不是 @987654332 @ -> V。那么我如何才能确保 C++ 更喜欢 Wrapper<T> -> Wrapper<U> 而不是 Wrapper<T> -> Wrapper<V>?
我做出这个澄清是因为答案似乎专门针对重载解决方案的某些方面,例如 cv 合格性,而我确实需要一个通用的解决方案。
【问题讨论】:
标签: c++ templates overloading implicit-conversion template-meta-programming