我需要一个将编译时字符串文字(const char * const)作为其唯一构造函数参数的类。
我希望有一个std :: array成员变量将单词存储在此字符串文字中(例如,使用空格分隔)。因此,此数组的大小永远不会改变,因为在编译时就知道字符串文字。
我怎样才能将此数组作为成员变量,同时使其大小由传递给构造函数的单词数来指定?
我想这样做,以便调用者无需在类模板参数中指定单词的数量,但是构造函数(大概是constexpr一个)可以在编译时推断出这一点。
我不想使用向量,因为在这种情况下是不必要的(存储的单词永远不会改变)。我将如何处理?
谢谢
首先,您必须使用类模板,因为对于不同的字符串文字,应该有不同的类大小。模板参数至少应包含封闭数组的大小(例如template<std::size_t N>
)。
然后,您可能会发现C ++ 17中的类模板参数推导很有用,因此您不必自动指定大小。您可以使用构造函数中的自动演绎,也可以提供自定义演绎指南。如果没有C ++ 17,则可以创建类似于make_pair
/的帮助程序函数,make_tuple
该函数将使用模板参数推导并创建相应的类。
#include <algorithm>
#include <array>
#include <cstddef>
#include <iterator>
#include <iostream>
template<std::size_t N>
struct WordStorage {
std::array<char, N> char_array;
WordStorage(const char (&char_array_)[N]) {
std::copy(char_array_, char_array_ + N, char_array.begin());
}
};
int main() {
WordStorage s("hello"); // Deduced to WordStorage<6> as "hello" is const char[6].
static_assert(s.char_array.size() == 6);
std::cout << s.char_array.data() << "\n";
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句