相关疑难解决方法(0)

模板参数推导中int a [5]和int(&a)[5]之间的区别

这个问题是关于采用静态已知大小的数组的函数.

以下面的最小程序为例:

#include <iostream>

template<size_t N>
void arrfun_a(int a[N])
{
    for(size_t i = 0; i < N; ++i)
        std::cout << a[i]++ << " ";
}

int main()
{
    int a[] = { 1, 2, 3, 4, 5 };
    arrfun_a<5>(a);
    std::cout << std::endl;
    arrfun_a<5>(a);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

运行时,打印预期结果:

2 3 4 5 6
3 4 5 6 7
Run Code Online (Sandbox Code Playgroud)

但是,当我试图让我的编译器(VS 2010)推断出5它时could not deduce template argument for 'int [n]' from 'int [5]'.

一些研究导致arrfun_b模板参数推导工作的更新:

template<size_t n>
void arrfun_b(int …
Run Code Online (Sandbox Code Playgroud)

c++ arrays templates template-argument-deduction

9
推荐指数
1
解决办法
648
查看次数

在这种情况下,有人可以解释"参考"和"指针"之间的区别吗?

当我读到这个问题的litb回答时,我了解到通过引用传递数组允许我们获得它的大小.我只是玩了一点代码,并尝试通过引用传递一个"函数",并且令人惊讶地(至少对我来说),这段代码编译:

void execute( void (&func)() ) // func is passed by reference!
{
    func();
}
Run Code Online (Sandbox Code Playgroud)

最后一个函数和这个函数之间有什么区别:

void execute( void (*func)() ) // func is passed by pointer!
{
    func();
}
Run Code Online (Sandbox Code Playgroud)

我尝试使用VC2008,它在每种情况下产生不同的输出.奇怪的是,在函数指针的情况下,编译器会更好地优化代码:

void print()
{
    std::cout << "Hello References!";
}
void execute( void (&func)() ) // optimized
{
    func();
}
int main()
{
    00291020  call   print (291000h)
}
=========================================
// In this case, the compiler removes all function calls in the code!
void print() // optimized!
{
    std::cout << …
Run Code Online (Sandbox Code Playgroud)

c++ pointers reference

6
推荐指数
1
解决办法
517
查看次数

神秘的oneliner模板代码,任何一个?

我正在阅读此页面: C++提示:如何获取数组长度.作者提出了一段代码来了解静态数组的大小.

template<typename T, int size>
int GetArrLength(T(&)[size]){return size;} // what does '(&)' mean ?
.
.
.
int arr[17];
int arrSize = GetArrLength(arr); // arrSize = 17
Run Code Online (Sandbox Code Playgroud)

任何人都可以阐明这段代码,因为我无法理解它是如何工作的.

c++ arrays templates metaprogramming

4
推荐指数
1
解决办法
356
查看次数

关于阵列大小计算

可能重复:
有人可以解释这个模板代码,它给出了数组的大小吗?

嗨,我正在看这里发布的答案:

计算阵列的长度

复制到这里:

template <typename T, std::size_t N>
std::size_t size(T (&)[N])
{
    return N;
}
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下(&)的重要性吗?

c++

3
推荐指数
1
解决办法
279
查看次数

为什么这个数组大小的模板不起作用?

作为使用模板的一些练习,我尝试编写一个函数模板来查找数组的大小:

template <typename T>
size_t arraySize(T array[]) {
    return (sizeof(array)/sizeof(T));
}
Run Code Online (Sandbox Code Playgroud)

然后我尝试使用一些不同数据类型的数组以及常规sizeof(数组)/ sizeof(数据类型)计算来测试模板,如下所示:

int main(){

int arr1[20];
char arr2[20];
double arr3[20];

cout << arraySize(arr1) << ' ' << arraySize(arr2) << ' ' << arraySize(arr3) << endl;
cout << sizeof(arr1)/sizeof(int) << ' ' << sizeof(arr2)/sizeof(char) << ' ' << sizeof(arr3)/sizeof(double);

}
Run Code Online (Sandbox Code Playgroud)

输出是

2 8 1
20 20 20
Run Code Online (Sandbox Code Playgroud)

为什么这个模板不能按预期工作?

注意:我知道存在与Stack Overflow上的模板有关的数组大小的其他问题(例如这一个),但我很担心为什么这个特定的代码不起作用.

c++ arrays size templates c++14

3
推荐指数
2
解决办法
412
查看次数

不以 nul 结尾的常量字符串文字

是否有一些技巧可以定义没有尾随字符的常量字符串文字'\0'

#define ARRAY_LEN(array) (sizeof(array)/sizeof((array)[0]))

static const char c_seqence[] = "___----__--_-_";
Run Code Online (Sandbox Code Playgroud)

因此 usingARRAY_LEN(c_seqence)返回实际序列长度而不带'\0'? 不应产生运行时开销。{'_','_',...}显然,由于可读性更好,类似字符串的表示形式比字符数组初始化更受青睐。

C 解决方案是首选,但某些 C++ 解决方案也可能很有趣,只要它们不依赖于 c++11 功能。

c c++

3
推荐指数
1
解决办法
283
查看次数

如何使用元编程获得数组的大小?

可能重复:
使用模板获取数组的大小和结束地址

有人可以解释这个模板代码,它给我一个数组的大小?(第一个答案包括获取值作为编译时间常量)

如何使用元编程获得数组的大小?多维也将受到赞赏.所以例如,如果我将一个类型传递给这个结构(如何调用它,让我们说get_dim)我会得到:

get_dim<int>::value; //0
get_dim<int[1]>::value //1
get_dim<int[2][3]>::value //2,3
Run Code Online (Sandbox Code Playgroud)

c++ metaprogramming

0
推荐指数
1
解决办法
750
查看次数