gpt4 book ai didi

c++ - 如何使用本身就是模板的类型专门化模板方法,其中只有返回类型依赖于模板类型?

转载 作者:太空狗 更新时间:2023-10-29 23:43:44 24 4
gpt4 key购买 nike

我想专门化非模板类中的单个模板方法以使用 std::vector 但是只有方法的返回类型使用模板。

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

class Foo
{
public:
template<typename T>
T Get()
{
std::cout << "generic" << std::endl;
return T();
}
};

template<>
int Foo::Get()
{
std::cout << "int" << std::endl;
return 12;
}

template<typename T>
std::vector<T> Foo::Get()
{
std::cout << "vector" << std::endl;
return std::vector<T>();
}

int main()
{
Foo foo;
auto s = foo.Get<std::string>();
auto i = foo.Get<int>();
}

编译时出现错误,表明 std::vector 尝试的特化与 Foo 的任何原型(prototype)都不匹配,这是完全可以理解的。

以防万一,使用 C++14 非常好。

最佳答案

您只能部分特化类(结构)( cppreference ) - 因此解决问题的方法是添加辅助结构以允许对 std::vector<T> 进行部分特化- 例如这样:

class Foo
{
private: // might be also protected or public, depending on your design
template<typename T>
struct GetImpl
{
T operator()()
{
std::cout << "generic" << std::endl;
return T();
}
};
public:
template<typename T>
auto Get()
{
return GetImpl<T>{}();
}
};

对于 int - 你可以完全专门化这个功能:

template<>
int Foo::GetImpl<int>::operator()()
{
std::cout << "int" << std::endl;
return 12;
}

对于 std::vector<T>你必须专门化整个结构:

template<typename T>
struct Foo::GetImpl<std::vector<T>>
{
std::vector<T> operator()()
{
std::cout << "vector" << std::endl;
return std::vector<T>();
}
};

关于c++ - 如何使用本身就是模板的类型专门化模板方法,其中只有返回类型依赖于模板类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42199607/

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