【发布时间】:2018-05-30 14:56:30
【问题描述】:
我有具有单一类型参数和const char* 类型完全专业化的类模板,简化示例如下:
template <typename T>
struct PrettyPrint {
PrettyPrint(const T& value) : value(value) {}
const T& value;
friend std::ostream& operator << (std::ostream& os, const PrettyPrint& pp) {
return os << "(" << pp.value << ")";
}
};
template <>
struct PrettyPrint<const char*> {
PrettyPrint(const char* value) : value(value) {}
const char* value;
friend std::ostream& operator << (std::ostream& os, const PrettyPrint& pp) {
return os << "\"" << pp.value << "\"";
}
};
简而言之 - 打印像 "abc" 这样的字符字符串和像 (123) 这样的所有其他值("" vs ())
因此,我添加了一个演绎指南,以替代所有 char[N] 类型的额外偏特化:
template <std::size_t N>
PrettyPrint(char(&)[N]) -> PrettyPrint<const char*>; //deduction guide
不幸的是它不起作用:
std::cout << PrettyPrint(7) << PrettyPrint("aaa") << PrettyPrint((const char*)"bbb");
(7)(aaa)"bbb"
预期输出:
(7)"aaa""bbb"
但是,令人惊讶的是,这是可行的:
template <typename T, std::size_t N>
PrettyPrinter(T(&)[N]) -> PrettyPrinter<const T*>; //deduction guide
std::cout << PrettyPrint(7) << PrettyPrint("aaa") << PrettyPrint((const char*)"bbb");
(7)"aaa""bbb"
所以问题:
- 这是正确的(那么为什么)或者这是编译器中的错误(使用 gcc/clang 测试 - 最新版本)
- 如果正确 - 那么如何将此模板扣除指南限制为仅限
char?
【问题讨论】:
标签: c++ c++17 template-argument-deduction