从一种模板实例化转换为另一种模板实例化

use*_*009 5 template-meta-programming c++11

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

template <typename const std::size_t max_size>
class fixed_string {
...
};
Run Code Online (Sandbox Code Playgroud)

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

我希望能够将此类的对象传递给采用模板实例化的方法,该模板实例化具有较低的 max_size 模板参数值,而无需进行任何复制。因此,例如以下方法:

void foo(const fixed_string<50>& val) {
}
Run Code Online (Sandbox Code Playgroud)

应该可以使用 fixed_string<100> 调用,以便以下操作:

void bar() {
 fixed_string<100> s = "gg";
 foo(s); 
}
Run Code Online (Sandbox Code Playgroud)

我怎么能这样做?

Tar*_*ama 0

fixed_string<50>fixed_string<100>是不相关的类型,因此默认情况下不起作用。

一种可能性是继承fixed_string<N>fixed_string<N-1>,但这可能会对您的实现施加不必要的限制。

您可以创建foo一个函数模板并使用static_assert或 SFINAE 来确保传递正确大小的字符串:

template <std::size_t Size>
void foo (const fixed_string<Size>& val) {
    static_assert(Size >= 50, "Size must be at least 50");
}
Run Code Online (Sandbox Code Playgroud)