隐式类型转换为数组
Implicit type conversion to array
我就直截了当地说:为什么第 38 行不隐式转换为 char (&([32]?
template <size_t StringSize>
struct StringT
{
private:
char mChars[StringSize];
public:
// Note: CharArray can decay to char*.
typedef char (&CharArray)[StringSize];
CharArray array() { return mChars; }
operator CharArray() { return mChars; }
operator const CharArray() const { return mChars; }
};
#include <iostream>
template<size_t Size>
void f(char (&array)[Size])
{
std::cout << "I am char array with size " << Size << "n";
}
int main()
{
StringT<32> someText;
// Conversion through method compiles.
f(someText.array());
// Explicit conversion compiles.
f((StringT<32>::CharArray)someText);
// Implicit conversion fails:
// source_file.cpp(38): error C2672: 'f': no matching overloaded function found
// source_file.cpp(38): error C2784: 'void f(char (&)[Size])': could not deduce template argument for 'char (&)[Size]' from 'StringT<32>'
// source_file.cpp(19): note: see declaration of 'f'
f(someText);
}
这目前只是一个小实验,但如果StringT<>
要达到预期目的,隐式转换是非常必要的 - 替换我正在使用的代码库中的大部分字符数组。
提前谢谢。
我知道这是针对重构任务的,但是在您的场景中可能不可行:
如果要维护main()
函数中所示的接口,则需要创建一个模板化的f()
重载,该重载将在应用任何隐式转换之前直接解析为StringT<Size>
。
template<size_t Size>
void f(StringT<Size>& v)
{
f(v.array());
}
注:注:我把它做成 non-const 是因为您的原始代码有一些奇怪的 const 处理,我希望该示例编译为您的 OP 的插入。
相关文章:
- 声明C++具有动态大小的数组类型在 Linux 中工作正常,但不能在 Windows 中工作
- 数组类型 int[n][n] 不可赋值,因为表达式必须具有常量值
- 取消引用结束指针到数组类型的一个
- 结构化绑定初始值设定项表单 { 赋值表达式 } 对于 clang 上的数组类型失败
- 如何在数组类型的模板代码中计算std::size_t
- LLVM 无法将数组类型强制转换为常量数组
- 推荐的方法在不初始化值的情况下使数组类型为 std::unique_ptr?
- 特征:从数组类型中获取标量类型是否记录?
- T D[N] 总是声明数组类型的对象吗?
- 如何在模板中推断数组类型?
- 字符串文字到 char 数组的转换如何在C++中实际工作
- 重载常量和非常量转换运算符返回数组类型时出现 MSVC 错误 C2593
- 将非类非数组 prvalue 转换为符合 cv 条件的类型是否合法?
- 将Boost Multi_array转换为本机数组类型
- 用于递归模板求值的强制转换数组类型
- 将字符数组类型转换为结构体(不是类/对象)
- 在读取.csv时将数组类型字符串转换为double
- 可变模板函数将数组类型强制转换为指针
- 如何将 void 类型的元素转换为整数数组类型
- 在编译时将std::数组强制转换为另一种数据类型