user-0 提问: 模板函数干嘛不支持 template  RET_T pri

回复:
user: user-0
content: 引用 9 楼 mujiok2003 的回复:[quote=引用 8 楼 FrankHB1989 的回复:] [quote=引用 5 楼 mujiok2003 的回复:] [quote=引用 4 楼 soso101 的回复:] 三个类型都显式调用，比如double v = prifunc＜double，int，int>(1, 1); c++ 11以前， 需要这样。  C++ 11 已经完美解决这个问题了。  #include <iostream> using namespace std; template<class Lhs, class Rhs>   auto adding_func(const Lhs &lhs, const Rhs &rhs) -> decltype(lhs+rhs) {return lhs + rhs;}    int main() { 	auto x = adding_func(5, 6.45); 	std::cout << x << std::endl;  //11.45 	return 0; }[/quote] 完美？return塞个有capture的lambda进去看你怎么写trailing-return-type。 [/quote] 这里的问题是lamda吗？[/quote]  5楼之后就看不懂了，前面的都对我很有用啊！谢谢各位。

user: user-1
content: 引用 10 楼 FrankHB1989 的回复:LZ说“网上找出来的例子都是只声明一种类型”于是有“感觉这样的用法太不方便了吧，模板到底怎么用的”的疑问。 因此“这里”的问题实质上是指怎么在调用处省略返回类型——并不强调返回类型具体是什么。 closure type不是LZ给的例子，但顺着你的解法是可以遇到这个坑的，所以在说“完美”之前，有必要提个醒。 如果对你的说法信以为真，看到C++14省略trailing-return-type以后感觉可能就是被你玩了一样。 引用auto x = adding_func(5, 6.45);  std::cout << x << std::endl;  //11.45  这就解决使用不方便及怎么使用的问题的，不多不少：函数调用的时候<...>不见了， 配合auto x的类型也编译器自行推导。完美解决lz的问题， 不是说 trailing-return-type完美。

user: user-2
content: 引用 9 楼 mujiok2003 的回复:[quote=引用 8 楼 FrankHB1989 的回复:] [quote=引用 5 楼 mujiok2003 的回复:] [quote=引用 4 楼 soso101 的回复:] 三个类型都显式调用，比如double v = prifunc＜double，int，int>(1, 1); c++ 11以前， 需要这样。  C++ 11 已经完美解决这个问题了。  #include <iostream> using namespace std; template<class Lhs, class Rhs>   auto adding_func(const Lhs &lhs, const Rhs &rhs) -> decltype(lhs+rhs) {return lhs + rhs;}    int main() { 	auto x = adding_func(5, 6.45); 	std::cout << x << std::endl;  //11.45 	return 0; }[/quote] 完美？return塞个有capture的lambda进去看你怎么写trailing-return-type。 [/quote] 这里的问题是lamda吗？[/quote] LZ说“网上找出来的例子都是只声明一种类型”于是有“感觉这样的用法太不方便了吧，模板到底怎么用的”的疑问。 因此“这里”的问题实质上是指怎么在调用处省略返回类型——并不强调返回类型具体是什么。 closure type不是LZ给的例子，但顺着你的解法是可以遇到这个坑的，所以在说“完美”之前，有必要提个醒。 如果对你的说法信以为真，看到C++14省略trailing-return-type以后感觉可能就是被你玩了一样。

user: user-1
content: 引用 8 楼 FrankHB1989 的回复:[quote=引用 5 楼 mujiok2003 的回复:] [quote=引用 4 楼 soso101 的回复:] 三个类型都显式调用，比如double v = prifunc＜double，int，int>(1, 1); c++ 11以前， 需要这样。  C++ 11 已经完美解决这个问题了。  #include <iostream> using namespace std; template<class Lhs, class Rhs>   auto adding_func(const Lhs &lhs, const Rhs &rhs) -> decltype(lhs+rhs) {return lhs + rhs;}    int main() { 	auto x = adding_func(5, 6.45); 	std::cout << x << std::endl;  //11.45 	return 0; }[/quote] 完美？return塞个有capture的lambda进去看你怎么写trailing-return-type。 [/quote] 这里的问题是lamda吗？

user: user-2
content: 引用 5 楼 mujiok2003 的回复:[quote=引用 4 楼 soso101 的回复:] 三个类型都显式调用，比如double v = prifunc＜double，int，int>(1, 1); c++ 11以前， 需要这样。  C++ 11 已经完美解决这个问题了。  #include <iostream> using namespace std; template<class Lhs, class Rhs>   auto adding_func(const Lhs &lhs, const Rhs &rhs) -> decltype(lhs+rhs) {return lhs + rhs;}    int main() { 	auto x = adding_func(5, 6.45); 	std::cout << x << std::endl;  //11.45 	return 0; }[/quote] 完美？return塞个有capture的lambda进去看你怎么写trailing-return-type。

user: user-3
content: 但是记得模板声明时的顺序即你的模板RET_T要放到第一位，要不然你还需要把RET_T之前的模板同样进行显示的实例化

user: user-3
content: 模板支持返回参数为模板参数，比如常调用的的函数make_share就会让你显示的指定返回类型(c++11)，因为在函数调用时无法直接推断返回类型，所以可以显示的提供模板实参，比如你的函数调用的方式可以修改为 prifunc<int> 代表返回int类型，而剩余的参数则按常规方式利用形参进行推断。  int tmp; tmp = prifunc<int>(3,5);  后面的两个模板参数被实例化为int类型

user: user-1
content: 引用 4 楼 soso101 的回复:三个类型都显式调用，比如double v = prifunc＜double，int，int>(1, 1); c++ 11以前， 需要这样。  C++ 11 已经完美解决这个问题了。  #include <iostream> using namespace std; template<class Lhs, class Rhs>   auto adding_func(const Lhs &lhs, const Rhs &rhs) -> decltype(lhs+rhs) {return lhs + rhs;}    int main() { 	auto x = adding_func(5, 6.45); 	std::cout << x << std::endl;  //11.45 	return 0; }

user: user-4
content: 三个类型都显式调用，比如double v = prifunc＜double，int，int>(1, 1);

user: user-5
content: 当函数返回值为模板参数时，编译器无法推断出该参数具体类型。需要向2楼那样调用才行

user: user-6
content: 模板定义是正确的

user: user-7
content: 擦，不是模板不对，是你不会调用吧。 int v = prifunc<int>(1, 1);