C++ 作为模板参数传递全局变量的地址何时有用?
我最近观看了一段来自微软的视频,解释了C++17的一些新特性,我很好奇地发现C++14的一个特性(甚至可能更早?),它允许您使用全局变量的地址作为模板参数的常量表达式 这允许使用如下代码:C++ 作为模板参数传递全局变量的地址何时有用?,c++,templates,optimization,c++14,C++,Templates,Optimization,C++14,我最近观看了一段来自微软的视频,解释了C++17的一些新特性,我很好奇地发现C++14的一个特性(甚至可能更早?),它允许您使用全局变量的地址作为模板参数的常量表达式 这允许使用如下代码: #include <iostream> int g_iTest = 5; template <int* Addr> struct S { static int TestAdd( int iTest ) { *Addr = iTest + *Addr;
#include <iostream>
int g_iTest = 5;
template <int* Addr>
struct S {
static int TestAdd( int iTest ) {
*Addr = iTest + *Addr;
return *Addr;
}
};
int main() {
S<&g_iTest> s;
std::cout << s.TestAdd( 5 ) << std::endl;
}
#包括
int g_iTest=5;
模板
结构{
静态整数测试DD(整数测试){
*地址=iTest+*地址;
返回*地址;
}
};
int main(){
S S;
std::cout指针模板化可以追溯到C++98
对函数指针进行模板化可以将指定函数作为类型的一部分,这通常很有用
在全局变量的地址上进行模板化的用例更为罕见。我只在一些实验代码中使用过它,其中变量是指向字符串的指针。我记得,extern
链接的要求存在一些问题,但这个问题可能在C++11中消失了(如果它最初存在的话).有时您希望访问全局状态
有几种方法可以做到这一点
您可以有一个静态
局部变量
您可以有一个引用的extern
变量
您可以有一个引用的静态
全局变量
您可以让调用者在(或获取全局状态的函数)中传递指向全局状态的指针/引用
或者可以将其作为指向模板
参数列表中全局变量的指针传递
对于上述每一种情况,您都可以将全局状态包装到函数调用中,并让函数为您获取。这只是增加了一个间接层次。(这也意味着可以将上述两种情况混合使用:使用静态局部的传递函数,或在其单元内访问静态全局状态的外部链接函数,等等)
剩下要证明的是,5比其他每一个都有一些优势
4需要显式的参数传递,这可能会造成干扰。您可能还需要约束签名来与另一个API进行互操作。全局状态在编译时确定这一事实也会导致一些优化,并降低对函数功能进行推理的难度(因为指向状态的指针是编译时确定的一组固定值之一)
1、2和3都将您使用的全局状态与代码紧密绑定在一起——同一段代码不能使用不同的全局状态,这取决于它的使用方式
5允许一段代码使用在其他地方选择的全局状态(包括多个不同的全局状态)。这可以更容易地进行模拟
一个具体的例子可能是模板
类型或函数,它存储指向程序员指定名称的指针。我可以围绕基于字符串的API编写一个包装器,通过将属性名称绑定到类或函数中,然后让它使用API,为我提供对该API中属性的无字符串访问<我确信这是第一次标准以来的有效C++。它当然不是C++的新特性。关键是模板参数是指针,而不是全局代码> INT/COM>的值。从其他地方访问并访问该值是不相关的,因为对象的位置仍然不会改变。@LightnessRacesinOrbit我可能很胖,但如果你想使用全局int
的地址,那么如果它被标记为extern
,你可以简单地使用全局int
上的一元&
操作符或std::address\u,在需要它的地方?我不明白你在问我什么。“必需”为什么?你是在问为什么人们把一个指针作为模板参数传递,而不是仅仅把它硬编码到他们想要使用的函数中?好吧,这就像任何其他模板一样:也许你想写一次相同的函数,但用不同的指针调用它。你能用简单的函数参数来实现吗?当然。但是,再次看看这就是我们曾经使用非类型模板参数并在这里简单地应用该逻辑的原因。(值得一提的是,我从来没有这样做过。)