gpt4 book ai didi

指针的 C++ 模板特化?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:03:49 28 4
gpt4 key购买 nike

我读了《C++ Templates - the Complete Guide》一书,学习了指针的模板特化。 (可能是我对这部分书的理解有误)

(1) 这是我的简单模板:

#include <iostream>

template<typename T>
void Function(const T& a)
{
std::cout << "Function<T>: " << a << std::endl;
}

template<typename T>
void Function<T*>(const T* a)
{
std::cout << "Function<T*>: " << a << std::endl;
}

int main(void)
{
Function(1);
Function(1.2);
Function("hello");
Function((void*)0x25);

return 0;
}

我使用的是 ubuntu16.04 x64,g++ 5.3,编译器报告:

$ g++ main.cpp -o main.exe 
main.cpp:10:29: error: non-type partial specialization ‘Function<T*>’ is not allowed
void Function<T*>(const T* a)

(2) 但这段代码是正确的:

#include <iostream>

template<typename T>
void Function(const T& a)
{
std::cout << "Function<T>: " << a << std::endl;
}

int main(void)
{
Function(1);
Function(1.2);
Function("hello");
Function((void*)0x25);

return 0;
}

结果显示:

$ g++ main.cpp -o main.exe
$ ./main.exe
Function<T>: 1
Function<T>: 1.2
Function<T>: hello
Function<T>: 0x25

我的问题是:关于指针特化的书错了吗?还是我理解错了这部分在书中的意思?还是别的?

关于类中指针特化的更新。

(3) 具有指针特化的模板类:

#include <iostream>

template<typename T>
struct Base {
T member;

Base(const T& a)
: member(a)
{
}

void hello()
{
std::cout << member << std::endl;
}
};

template<typename T>
struct Base<T*> {
T* member;

Base(T* a)
: member(a)
{
}

void hello()
{
std::cout << member << std::endl;
}
};

int main(void)
{
Base<int> b1(12);
Base<double> b2(2.4);
Base<char*> b3("hello");
Base<void*> b4((void*)0x25);

b1.hello();
b2.hello();
b3.hello();
b4.hello();

return 0;
}

此代码是正确的,但有一个警告:

$ g++ main.cpp -o main.exe 
main.cpp: In function ‘int main()’:
main.cpp:37:27: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
Base<char*> b3("hello");
^
$ ./main.exe
12
2.4
hello
0x25

(4) 没有指针特化的模板类:

#include <iostream>

template<typename T>
struct Base {
T member;

Base(const T& a)
: member(a)
{
}

void hello()
{
std::cout << member << std::endl;
}
};

int main(void)
{
Base<int> b1(12);
Base<double> b2(2.4);
Base<char*> b3("hello");
Base<void*> b4((void*)0x25);

b1.hello();
b2.hello();
b3.hello();
b4.hello();

return 0;
}

结果是一样的:

$ g++ main.cpp -o main.exe
main.cpp: In function ‘int main()’:
main.cpp:39:27: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
Base<char*> b3("hello");
^
$ ./main.exe
12
2.4
hello
0x25

这是否意味着指针特化是不必要的?或者也许这个特性在不同的编译器上表现不同?

最佳答案

正如您已经被告知的那样,函数模板的部分特化是不允许的。您可以为此使用 std::enable_if:

template <typename T, typename std::enable_if_t<!std::is_pointer<T>::value>* = 0>
void func(T val) { std::cout << val << std::endl; }

template <typename T, typename std::enable_if_t<std::is_pointer<T>::value>* = 0>
void func(T val) { func(*val); }

如果您正在寻找更简单的语法,请等待概念

关于指针的 C++ 模板特化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41737752/

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