Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 有没有一种方法可以编写多态模板函数?_C++_C++11_Templates - Fatal编程技术网

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。