gpt4 book ai didi

c++11 - 从一种模板实例化转换为另一种模板实例化

转载 作者:行者123 更新时间:2023-12-03 08:18:20 25 4
gpt4 key购买 nike

我有一个固定大小的字符串类,定义如下:

template <typename const std::size_t max_size>
class fixed_string {
...
};

此类保留一个字符缓冲区来保存字符的 max_size。

我希望能够将此类的对象传递给采用模板实例化的方法,该模板实例化具有较低的 max_size 模板参数值,而无需进行任何复制。因此,例如以下方法:
void foo(const fixed_string<50>& val) {
}

应该可以使用 fixed_string<100> 调用,以便以下操作:
void bar() {
fixed_string<100> s = "gg";
foo(s);
}

我怎么能这样做?

最佳答案

第一 react 是reinterpret_cast从大到小 fixed_string s 假设编译器以类似的方式布置它们,但由于 C++ 的严格别名规则,这将是非法的(对象可能永远不会被不同类型的引用或指针访问,除非其中之一是 [signed|unsigned] char )

您可以通过创建一个自定义引用模板来解决这个问题 fixed_string s 可以隐式转换为:

#include <type_traits>

template<std::size_t N>
struct fixed_string_ref {
char *string;
};

template<std::size_t N>
struct fixed_string_const_ref {
const char *string;
};

template<std::size_t N>
struct fixed_string {
char string[N];

template<std::size_t M, typename std::enable_if<(M < N), int>::type = 0>
operator fixed_string_const_ref<M>() const {
return fixed_string_const_ref<M> { string };
}

template<std::size_t M, typename std::enable_if<(M < N), int>::type = 0>
operator fixed_string_ref<M>() {
return fixed_string_ref<M> { string };
}
};

void foo(fixed_string_const_ref<10>) {}

int main() {
fixed_string<20> f;
foo(f);
//fixed_string<5> g;
//foo(g); <- cannot be converted to fixed_string_const_ref<10>
}
fixed_string[_const]_ref只是持有一个指向 fixed_string 的指针的数据,因此可以在不复制字符串的情况下按值传递。需要有两种这样的类型,一种是常量,一种是非常量,以保持常量的正确性。
enable_if部分确保仅引用更小或等于 fixed_string s 可以创建。

可选 : 通过向 fixed_string_const_ref 添加两个构造函数,普通字符串文字也可以作为固定字符串引用传递。

template<std::size_t N>
struct fixed_string_const_ref {
const char *string;

explicit fixed_string_const_ref(const char *s)
: string(s) {}

template<std::size_t M, typename std::enable_if<(M >= N), int>::type = 0>
fixed_string_const_ref(const char (&s)[M])
: string(s) {}
};

// ...

int main() {
// ....
foo("Hello World");
//foo("Hello"); <- cannot be converted to fixed_string_const_ref<10>
}

通过制作第一个 explicit第二个通过 enable_if 限制,再次只能从足够长的字符串文字创建引用。

关于c++11 - 从一种模板实例化转换为另一种模板实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33012014/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com