隐式类型转换为数组
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());
}
N.B。我将其设为非 const,因为您的原始代码有一些奇怪的 const 处理,我希望该示例作为您的 OP 的插件进行编译。
我马上开始讲:为什么第 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());
}
N.B。我将其设为非 const,因为您的原始代码有一些奇怪的 const 处理,我希望该示例作为您的 OP 的插件进行编译。