C++ 有没有一种方法可以编写多态模板函数?
假设我有一个函数C++ 有没有一种方法可以编写多态模板函数?,c++,c++11,templates,C++,C++11,Templates,假设我有一个函数 template <typename T> T foo() { // do stuff return T(/* some value*/); } 但是,当T是std::string时,当T是其他类型时,我希望执行的操作不起作用,因此我会得到编译错误。是否有任何方法可以使此多态,或者我应该使用不同的函数名,如fooString()?您可以使用模板专门化: template <typename T> T foo() { //v1
template <typename T>
T foo() {
// do stuff
return T(/* some value*/);
}
但是,当
T
是std::string
时,当T
是其他类型时,我希望执行的操作不起作用,因此我会得到编译错误。是否有任何方法可以使此多态,或者我应该使用不同的函数名,如fooString()
?您可以使用模板专门化:
template <typename T>
T foo() { //v1
return T(/* some value */);
}
template <>
std::string foo() { // v2
return "Hello World !";
}
模板
T foo(){//v1
返回T(/*某个值*/);
}
模板
std::string foo(){//v2
返回“你好,世界!”;
}
使用字符串(作为模板参数)调用时,将调用foo
的版本2。否则就是版本1
编辑
查看@BartekBanachewicz对问题的评论,了解为什么不应使用函数模板专业化。您可以使用模板专业化:
template <typename T>
T foo() { //v1
return T(/* some value */);
}
template <>
std::string foo() { // v2
return "Hello World !";
}
模板
T foo(){//v1
返回T(/*某个值*/);
}
模板
std::string foo(){//v2
返回“你好,世界!”;
}
使用字符串(作为模板参数)调用时,将调用foo
的版本2。否则就是版本1
编辑
查看@BartekBanachewicz对问题的评论,了解为什么不应使用函数模板专业化。您可以使用SFINAE
#include <complex>
#include <iostream>
#include <type_traits>
template <typename T>
typename std::enable_if<false == std::is_same<T, std::string>::value, T>::type
foo ()
{
std::cout << "- generic foo()" << std::endl;
return T{};
}
template <typename T>
typename std::enable_if<true == std::is_same<T, std::string>::value, T>::type
foo ()
{
std::cout << "- std::string foo()" << std::endl;
return T{""};
}
int main()
{
foo<int>(); // print - generic foo()
foo<std::complex<long double>>(); // print - generic foo()
foo<std::string>(); // print - std::string foo()
}
#包括
#包括
#包括
模板
typename std::enable_if::type
foo()
{
你可以使用SFINAE
#include <complex>
#include <iostream>
#include <type_traits>
template <typename T>
typename std::enable_if<false == std::is_same<T, std::string>::value, T>::type
foo ()
{
std::cout << "- generic foo()" << std::endl;
return T{};
}
template <typename T>
typename std::enable_if<true == std::is_same<T, std::string>::value, T>::type
foo ()
{
std::cout << "- std::string foo()" << std::endl;
return T{""};
}
int main()
{
foo<int>(); // print - generic foo()
foo<std::complex<long double>>(); // print - generic foo()
foo<std::string>(); // print - std::string foo()
}
#包括
#包括
#包括
模板
typename std::enable_if::type
foo()
{
std::不欢迎使用堆栈溢出。请花时间阅读并参考您可以在此处询问的内容和方式。如果您想在T
为std::string
时获得特定行为,为什么不简单地使用重载?@piwi您的意思是specialize?@BartekBanachewicz,但没有可重载的参数。因为函数模板专门化是指,您还可以引入一个标记来利用无参数函数的重载机制。欢迎使用堆栈溢出。请花时间阅读并参考您可以在此处询问的内容和方式。如果您想在T
为std::string
时获得特定行为,为什么不简单地使用过载?@ PiWi?您是指专门C++?但是BartekBanachewicz没有超载的参数。由于函数模板特化,您还可以引入一个标记来使用无参数函数的过载机制。17@BoundaryImposition-是的,我等不及了用C++ C++ 17支持,这就是“代码”>如果CistExpR< /COD>将在C++中修复17@BoundaryImposition-是的;我迫不及待地想要一个完全支持C++17的gcc或clang。