【发布时间】:2019-10-14 19:52:43
【问题描述】:
假设我有一个包装字符串文字的类:
template <size_t N>
class literal {
public:
constexpr literal(const char(&s)[N+1]) : wrapped_(s) {}
constexpr const char * c_str() const { return wrapped_; }
constexpr size_t size() const { return N; }
private:
const char (&wrapped_)[N+1];
};
template <size_t N>
literal<N-1> make_literal(const char (&s)[N]) { return literal<N-1>(s); }
现在,我希望这种包装字符串类型的实例可以隐式转换回const char[N],在某种程度上我仍然可以访问它的大小。我希望能够做类似的事情:
template <size_t N>
void foo(const char(&s)[N]) {
std::cout << N << ": " << s << std::endl;
}
int main() {
constexpr auto s = make_literal("testing");
foo(s);
}
我的目标是为foo() 定义一个函数,它可以接受实际的字符串文字以及包装的文字。我尝试将用户定义的转换运算符添加到类定义中:
using arr_t = char[N+1];
constexpr operator const arr_t&() const { return wrapped_; }
但这给了我以下的叮当声:
候选模板被忽略:无法将 'const char [N]' 与 'const literal' 匹配
如果我将对foo() 的调用更改为以下内容,则可以:
foo((const char(&)[8])s);
...这意味着转换运算符有效,但不是在模板参数推导的上下文中。有没有什么方法可以在不定义 foo() 的情况下完成这项工作以获取包装的文字?
【问题讨论】: