2

很抱歉问了一个我认为我知道答案的问题,但它对我来说似乎很奇怪,它不可能是正确的。

如果我有一个模板函数

template<typename T>
int TemplatedSize(T &ref){
    return sizeof(ref);
}

我用这样的字符串文字实例化它:

int i = TemplatedSize("oh how I love C++ sometimes");

我被模板实例化删除的是一个函数,它引用了一个长度为 28 的 const char 数组?我查找了它的语法,我必须说我以前从未在代码中见过它。这是否等同于实例化的内容?

int NonTemplatedSize(const char (&arrayRef)[28]){
    return sizeof(arrayRef);
}

如果这是正确的,如果我的函数体中不仅仅是一个 sizeof 并且使用许多不同大小的字符串文字调用该函数,我将不得不担心代码膨胀?

4

1 回答 1

0

是的,这是正确的类型,是的,您将为传递给它的每个字符串文字长度获得一个新实例。为了帮助减少膨胀,您可以使这些函数内联,可能将 achar *和 size 传递给另一个非模板函数。

int doSomeCalculation(const char *s,size_t n);

template <size_t n>
inline int doSomeCalculation(const char (&s)[n])
{
  return doSomeCalculation(s,n);
}
于 2013-07-04T16:30:08.410 回答