将模板函数传递给模板函数

时间:2019-07-29 14:04:50

标签: c++ templates function-templates

此代码段可能吗?我找不到适合模板的正确语法

// Example program
#include <iostream>

template<typename T>
void print_value()
{
    T t;
    std::cout << t << std::endl;
}

template<typename DO>
void dispatch_do()
{
    DO<int>();
    DO<float>();
}

int main()
{
    dispatch_do<print_value>();
    return 0;
}

1 个答案:

答案 0 :(得分:4)

print_value不是类型,因此您不能将其传递到接受typename的模板。最简单的选择是传递lambda-C ++ 20解决方案:

template <typename T>
void print_value()
{
    T t;
    // ...
}

template <typename F>
void dispatch_do(F&& f)
{
    f.template operator()<int>();
    f.template operator()<float>();
}

int main()
{
    dispatch_do([]<typename T>(){ print_value<T>(); });
    return 0;
}

live example on godbolt.org


C ++ 14解决方案:

template <typename T>
struct type_wrapper { using type = T; };

template <typename F>
void dispatch_do(F&& f)
{
    f(type_wrapper<int>{});
    f(type_wrapper<float>{});
}

int main()
{
    dispatch_do([](auto x){ print_value<typename decltype(x)::type>(); });
    return 0;
}

live example on godbolt.org