存储字符串文字数组,以传递给期望字符串文字的模板

时间:2017-07-24 14:52:37

标签: c++ string

我有一个类,我使用字符串文字的长度作为模板参数。这样,在编译时评估文字的长度,并且没有理由在运行时执行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*数组中时,字符串就会丢失。是否有其他方便的方法来存储这些以实现这种功能?

1 个答案:

答案 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