gpt4 book ai didi

c++ - 模板类的模板函数特化

转载 作者:可可西里 更新时间:2023-11-01 16:29:49 27 4
gpt4 key购买 nike

是否可以在 C++11/14 中编写类似的东西?

#include <iostream>
#include <vector>

template <typename T>
T Get();

template <typename T>
struct Data {
std::vector<T> data;
};

template <>
template <typename T>
Data<T> Get<Data<T>>() {
return Data<T>{{T{}, T{}}};
}

template <>
template <typename T>
std::vector<T> Get<std::vector<T>>() {
return std::vector<T>(3);
}

int main() {
std::cout << Get<Data<int>>().data.size() << std::endl; // expected output is 2
std::cout << Get<std::vector<int>>().size() << std::endl; // expected output is 3
return 0;
}

在这种情况下重载无济于事,因为调用 Get<...>()将是模棱两可的(see):

template <typename T>
Data<T> Get() {
return Data<T>{{T{}, T{}}};
}

template <typename T>
std::vector<T> Get() {
return std::vector<T>(3);
}

欢迎任何关于如何克服这个问题的指导。

最佳答案

有一个解决方法,它给你这样的东西:不要专门化 - 过载:

#include <iostream>
#include <vector>
#include <string>

using namespace std;

template <typename T>
size_t Get(const T& data)
{
return 444;
}

template <typename T>
struct Data
{
std::vector<T> data;
};

template <typename T>
size_t Get(const Data<T>& data) {
return data.data.size();
}

int main() {
std::cout << Get<>(0) << std::endl; // expected output is 444
std::cout << Get<>(Data<int>{}) << std::endl; // expected output is 0
return 0;
}

输出:

444
0

请注意,size_t Get(const Data<T>& data)不是专业——它完全“不同”Get() , 这是为 Data<T> 类型的参数调用的对于任何 T .

Here你可以看到工作示例。


编辑

我看到你完全改变了你的问题。但是,我仍然会尝试回答它。对于缺少部分函数特化,有一个标准的解决方法 - 使用对结构/类的委托(delegate)。

这是你需要的:

#include <iostream>
#include <vector>

using namespace std;

template <typename T>
struct GetImpl;

template <typename T>
struct Data {
std::vector<T> data;
};

template <typename T>
struct GetImpl< Data<T> >
{
static Data<T> Get() {
return Data<T>{ {T{}, T{}} };
};
};

template <typename T>
struct GetImpl< std::vector<T> >
{
static std::vector<T> Get() {
return std::vector<T>(3);
};
};

int main() {
std::cout << GetImpl< Data<int> >::Get().data.size() << std::endl; // expected output is 2
std::cout << GetImpl< std::vector<int> >::Get().size() << std::endl; // expected output is 3
return 0;
}

输出:

2
3

Working sample can be found here.


如果您不喜欢语法,可以通过更改静态函数 Get() 使其更短一些函数调用操作符:

template <typename T>
struct Get< Data<T> >
{
Data<T> operator()() {
return Data<T>{ {T{}, T{}} };
};
};

template <typename T>
struct Get< std::vector<T> >
{
std::vector<T> operator()() {
return std::vector<T>(3);
};
};

然后:

Get< Data<int> >()().data.size();
Get< std::vector<int> >()().size();

您只有两个额外字符 - () .这是我能想到的最短的解决方案。

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

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