gpt4 book ai didi

c++ - 类和函数之间的模板缺乏正交性

转载 作者:搜寻专家 更新时间:2023-10-31 01:58:36 26 4
gpt4 key购买 nike

// InternalTemplate.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

template<class T>
struct LeftSide
{
static void insert(T*& newLink, T*& parent)
{
parent->getLeft() = newLink;
newLink->parent = newLink;
}
};

template<class T>
struct Link
{
T* parent_;
T* left_;
T* right_;
T*& getParent()const
{
return parent_;
}
template<class Side>
void plugIn(Link<T>*& newLink);


};

template<class T>
template<class Side>
void Link<T>::plugIn(Link<T>*& newLink)//<<-----why can't I type
//void Link<T>::plugIn<Side>(Link<T>*& newLink)<---<Side> next to plugIn


{
Side::insert(newLink,this);
}

int _tmain(int argc, _TCHAR* argv[])
{
return 0;
}

我觉得很奇怪,我必须为类指定参数,但不能为函数指定参数。有什么原因吗?

最佳答案

函数模板和类模板是互补的(我称它们为正交,但你可以不同意),在模板元编程中它们实际上服务于正交目的。

类模板允许您对模板参数进行模式匹配,即。他们提供部分特化

相反,函数模板不允许部分特化,但它们允许模板参数推导,这意味着您不必显式编写模板参数(额外参数除外,如您的示例所示)。

我认为,这解释了语法上的差异,因为它们可以实现的目标不同。此外,函数模板可以重载,类模板不能。

结合这两个概念的方法是

1) 如果你想对函数模板进行部分特化,则使用带有静态非模板函数的辅助类模板:

template <typename T>
struct doSomethingWithPointersHelper
{
static void act(T x) { ... }
};

template <typename T>
struct doSomethingWithPointersHelper<T*>
{
static void act(T* x) { ... }
};

// This acts as if we had a partial specialization
// for pointer types
template <typename T>
doSomethingWithPointers(T x)
{ return doSomethingWithPointersHelper<T>::act(x); }

在特定情况下,还有其他方法可以实现此目的,但这种方法始终有效。

2) 如果您想在构造复杂类时使用参数推导,则需要辅助模板函数:

template <typename T, typename U>
struct MyComplexClass
{ ... };

template <typename T, typename U>
MyComplexClass<T, U> makeComplex(T t, U u)
{ return MyComplexClass<T, U>(t, u); }

在标准库中,您可以找到使用此技术的make_pairbind1stmem_fun

关于c++ - 类和函数之间的模板缺乏正交性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3829771/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com