C ++模板参数推断和字符串文字
-
30-09-2019 - |
题
我有一个“集”数据类型:
template <class V>
struct Set {
void add(const V& value) {}
};
我想编写一个顶级功能版本 Set::add
.
template <class V>
void add(const Set<V>& set, const V& value) {}
这与字符串文字不完全合作:
Set<const char*> set;
const char* val = "a";
set.add(val); // ok
set.add("a"); // ok
add(set, val); // ok
add(set, "a"); // ERROR
add<const char*>(set, "a"); // ok
错误消息(G ++ 4.2.4):
no matching function for call to ‘add(Set<const char*>&, const char [2])’
看起来与以下事实有关 "a"
有类型 const char[2]
并不是 const char*
. 。有人知道如何使它起作用吗?
解决方案
问题是 V
获取一种类型的左参数,另一种类型为正确的类型。我怀疑你也想说 add(setOfLong, 0)
- 但是使用该模板,您无法。我建议添加一个单独的模板参数来解决此问题
template <class SetV, class V>
void add(const Set<SetV>& set, const V& value) {}
其他提示
还有另一种解决这个问题的方法(忘记了我在哪里看到的...)。
您可以使用“身份”类型包装器具有编译器 不是 执行推理时考虑类型。
template <T>
struct Identity {
typedef T type;
};
然后定义这样的“添加”:
template <class V>
void add(const Set<V>& set, const typename Identity<V>::Type& value) {}
这导致“ V”仅根据第一个参数类型推导。一旦确定,它就会继续并将其用于第二个参数,该参数正常。
不隶属于 StackOverflow