我有一个类,我使用字符串文字的长度作为模板参数。这样,在编译时评估文字的长度,并且没有理由在运行时执行strlen
(或等效)。我想对一系列字符串文字做同样的事情。
// Handler class
class Handler {
template<size_t N>
bool String(const char(&str)[N]) { /* ... */ }
};
Handler myHandler;
// Works
myHandler.String("it");
// Handler::String(const char (&)[N])': could not deduce template argument for 'const char (&)[N]' from 'const char *const *'
const char* manyIts[3] = {"this", "and", "that" };
for (int i = 0; i < 3; ++i) {
myHandler.String(manyIts[i]);
}
我理解,当将字符串存储在const char*
数组中时,字符串就会丢失。是否有其他方便的方法来存储这些以实现这种功能?
答案 0 :(得分:1)
问题是数组必须具有统一类型的元素。由于您在类型中编码字符串的大小,因此您不能拥有不同长度的字符串数组。您可以使用std::tuple
生成不同类型的元素的编译时数组。诀窍是防止字符数组衰减到指向第一个元素的指针。
使用可变参数模板,您可以编写一个返回指向t(sapply(1:NROW(mat), function(i)
sapply(1:NCOL(mat), function(j)
sum(mat[max(1, i-1):min(NROW(mat), i+1), max(1, j-1):min(NCOL(mat), j + 1)]))))
# [,1] [,2] [,3] [,4] [,5]
#[1,] 4 6 5 4 2
#[2,] 5 7 6 4 2
#[3,] 4 6 5 4 2
#[4,] 2 3 3 3 2
数组的指针元组的函数。
const char
简单地使用#include <tuple>
// Define an alias for pointer to const char array
template<size_t N>
struct t_str_ptr { using type = const char(*)[N]; };
// Returns a tuple of pointers to cont char arrays
template<size_t ... N>
auto make_str_tuple(const char(&...p_str)[N])
{
return std::make_tuple<typename t_str_ptr<N>::type...>(&p_str...);
}
并依赖参数推断会产生std::make_tuple
std::tuple
,这将丢失尺寸信息。
用法变为:
const char *
现在的挑战是迭代int main()
{
Handler myHandler;
// Works
myHandler.String("it");
// Works
auto manyIts = make_str_tuple( "this", "and", "that" );
myHandler.String(*std::get<0>(manyIts));
myHandler.String(*std::get<1>(manyIts));
myHandler.String(*std::get<2>(manyIts));
}
。由于每个元素都有自己的类型,因此它不像编写tuple
循环那么容易。请注意for
中的索引是模板参数。为避免重复,请参阅std::get
上的this question。