我知道,给定一个特定的函数参数,存在自动类型推导函数模板的可能性,但是对于非类型模板参数是否也存在这样的方法?
示例:
#include <iostream>
template<typename T, T val>
void func_a(void) {
std::cout << val << std::endl;
}
template<typename T>
void func_b(T val) {
std::cout << val << std::endl;
}
int main(void) {
func_a<uint32_t, 42u>();
//func_a<42u>(); //This line doesn't work
func_b(42u);
return 0;
}
因此,每当我致电uint32_t
时,我都不想每次都给出模板参数类型func_a()
。 C ++ 17或更低版本中是否存在这样的方法?
我正在使用g ++ v.7.3和c ++ 17。
答案 0 :(得分:10)
在C ++ 17中,您可以使用auto
:
template<auto val>
void func_a(void) {
std::cout << val << std::endl;
}
int main(void) {
func_a<42u>();
return 0;
}
答案 1 :(得分:4)
考虑到C ++ 17解决方案的+1,一个优于空的C ++ 11 / C ++ 14解决方案可以使用宏来激活decltype()
参数。< / p>
例如,使用宏
#define func_a_macro(val) func_a<decltype(val), val>
#define func_a_macro(val) \
func_a<std::remove_reference<decltype(val)>::type, val>
你可以打电话
func_a_macro(42u)();
p.s。:我知道......我知道......宏是邪恶的......但有时候很有用。
答案 2 :(得分:1)
没有宏的C ++ 14解决方案:
template<int N> auto Int = std::integral_constant<int, N>{};
template<class T, T n>
constexpr auto foo(std::integral_constant<T, n> x)
{
std::cout << x.value << std::endl;
}
int main()
{
foo(Int<6>);
}
C ++ 11:
template<int N> using Int = std::integral_constant<int, N>;
template<class T, T n>
constexpr void foo(std::integral_constant<T, n> x)
{
std::cout << x.value << std::endl;
}
int main()
{
foo(Int<6>());
}