gpt4 book ai didi

c++ - 模板函数与类中的脱线定义

转载 作者:IT老高 更新时间:2023-10-28 12:48:13 26 4
gpt4 key购买 nike

我想知道在类中声明模板函数是否有任何优势。

我试图清楚地了解这两种语法的优缺点。

下面是一个例子:

脱线:

template<typename T>
struct MyType {
template<typename... Args>
void test(Args...) const;
};

template<typename T>
template<typename... Args>
void MyType<T>::test(Args... args) const {
// do things
}

类对比:
template<typename T>
struct MyType {
template<typename... Args>
void test(Args... args) const {
// do things
}
};

第一版或第二版是否有更容易使用的语言功能?使用默认模板参数或 enable_if 时,第一个版本会妨碍吗?我想看看这两个案例如何与不同的语言功能(如 sfinae)以及 future 潜在的功能(模块?)进行比较。

考虑编译器特定的行为也很有趣。我认为 MSVC 需要 inline在某些地方有第一个代码片段,但我不确定。

编辑:我知道这些功能的工作方式没有区别,这主要是品味问题。我想看看这两种语法如何使用不同的技术,以及一种相对于另一种的优势。我看到的答案大多是偏向于另一个,但我真的想得到双方的支持。更客观的答案会更好。

最佳答案

Are there language features that are easier to use with the first or second version?



一个相当微不足道的案例,但值得一提的是:特化。

例如,您可以使用外部定义执行此操作:
template<typename T>
struct MyType {
template<typename... Args>
void test(Args...) const;

// Some other functions...
};

template<typename T>
template<typename... Args>
void MyType<T>::test(Args... args) const {
// do things
}

// Out-of-line definition for all the other functions...

template<>
template<typename... Args>
void MyType<int>::test(Args... args) const {
// do slightly different things in test
// and in test only for MyType<int>
}

如果你只想对类内定义做同样的事情,你必须复制 MyType 的所有其他函数的代码。 (当然,假设 test 是您想要专门化的唯一功能)。
举个例子:
template<>
struct MyType<int> {
template<typename... Args>
void test(Args...) const {
// Specialized function
}

// Copy-and-paste of all the other functions...
};

当然,您仍然可以混合使用类内和外部定义来做到这一点,并且您拥有与完整外部版本相同数量的代码。
无论如何,我假设您面向的是完整的类内和完整的线外解决方案,因此混合解决方案是不可行的。

您可以使用外部类定义做而根本无法使用类内定义做的另一件事是函数模板特化。
当然,您可以将主要定义放在类中,但所有特化必须放在外。

在这种情况下,上述问题的答案是:该语言甚至存在您无法与其中一个版本一起使用的功能。

例如,请考虑以下代码:
struct S {
template<typename>
void f();
};

template<>
void S::f<int>() {}

int main() {
S s;
s.f<int>();
}

假设类的设计者想要为 f 提供一个实现。仅适用于少数特定类型。
他根本无法用类定义来做到这一点。

最后,外部定义有助于打破循环依赖。
这已经在 most of 中提到了 the other answers不值得再举一个例子。

关于c++ - 模板函数与类中的脱线定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40381680/

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