模板类型扣除模板参数

时间:2018-03-26 20:01:26

标签: c++ c++11 templates c++17 template-deduction

我知道,给定一个特定的函数参数,存在自动类型推导函数模板的可能性,但是对于非类型模板参数是否也存在这样的方法?

示例:

#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。

3 个答案:

答案 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>
或更好,正如liliscent所建议的,以避免引用问题

#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>());
}