我试图推断出非类型模板参数。
#include <iostream>
template <unsigned int S>
void getsize(unsigned int s) { std::cout << s << std::endl; }
int main()
{
getsize(4U);
// Id like to do this without explicitly stating getsize<4U>(4);
// or even getsize<4U>();
// Is this possible?
}
但我收到错误:
deduce_szie_t.cpp: In function 'int main()':
deduce_szie_t.cpp:9:15: error: no matching function for call to 'getsize(unsigned int)'
deduce_szie_t.cpp:9:15: note: candidate is:
deduce_szie_t.cpp:4:6: note: template<unsigned int <anonymous> > void getsize(unsigned int)
deduce_szie_t.cpp:4:6: note: template argument deduction/substitution failed:
deduce_szie_t.cpp:9:15: note: couldn't deduce template parameter '<anonymous>'
是否可以推导出unsigned int,而不必显式声明模板参数?
我喜欢像以下一样清洁:getsize(4U) 我想避免写作:getsize&lt; 4U&gt;()
非常感谢您的帮助
答案 0 :(得分:4)
可以从函数参数中推导出非类型模板参数,但不能以您想要的方式推导出。它只能从函数参数的类型推断出来,而不能从值中推断出来。
例如:
template <unsigned int S>
void getsize(int (*s)[S]) {
std::cout << "pointer value: " << (void*)s << std::endl;
std::cout << "deduced size: " << S << std::endl;
}
getsize(static_cast<int (*)[4]>(0));
答案 1 :(得分:1)
以下代码提及最少次数4
:
template <unsigned int N>
void getsize()
{
std::cout << N << std::endl;
}
int main()
{
getsize<4>();
}
你不可能提到这个数字不到一次。
答案 2 :(得分:1)
这样做有什么问题(我认为这就是你想要的?)
#include <iostream>
template<typename Ty>
void getsize(Ty t) { std::cout << t << std::endl; };
int main(int argc, char *argv[])
{
getsize(4U);
return 0;
}