gpt4 book ai didi

c++ - 函数模板特化与模板

转载 作者:行者123 更新时间:2023-11-28 06:43:40 28 4
gpt4 key购买 nike

我有一个函数模板,其中包含各种类型的特化。但是,我想为指针定义一个模板特化。

为了澄清,这是现有代码的一部分:

template<typename T> inline T Get(int i);
/* ... */
template<> inline bool Get(int index) {
//...
}
template<> inline std::string Get(int index) {
//...
}

现在我计划添加一个特化,当 T 是一个指向类的指针时执行。我试图添加以下几行,但是这个(可以说是不完整的)变体似乎没有被接受为第一个未定义模板的专门化。 (调用不明确);其他类型特征安排也没有以成功的编译结束。

template<typename T>
typename std::enable_if<std::is_pointer<T>::value, T>::type
inline Get(int index) {
//...
}

我在这里有什么选择?

最佳答案

您不能部分特化函数模板,而您的尝试实际上创建了一个不同的重载模板。没有所有 SFINAE 噪音的最干净的方法是将它包装在一个类模板中,您可以部分特化,然后编写一个函数模板,该模板分派(dispatch)到适当的类模板特化:

template <class T>
struct do_get;

template <>
struct do_get<bool> {
static bool get(int i) { /*...*/ }
};

template <class T>
struct do_get<T*> {
static T* get(int i) { /*...*/ }
};

template <class T>
T Get(int i) { return do_get<T>::get(i); }

Demo .

T 是一个指针时,另一种方法是使用 enable_if 显式禁用未定义​​的基本模板,但如果您想添加额外的重载,这很快就会变得不堪重负。

关于c++ - 函数模板特化与模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25440000/

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