c++ - 从依赖的非类型模板参数自动推导类型模板参数

标签 c++ templates c++17

我定义了一个类模板X像这样:

template <typename T>
using Func = void(T);

template <typename T, Func<T> F>
class X { ... };

现在我可以使用类 X像这样:

void func(int i);

X<int, &func> x;

重复输入 int 对我来说似乎是多余的在 x 的声明中.有没有办法可以自动推断出来?我的意思是我想要一个类型模板 Y可以通过 Y<&func> 使用等于X<int, &func>自动推断int .

我尝试了很多,甚至定义了疯狂的模板函数并使用了 decltype , 但似乎没有办法删除 T在命名 &func 之前.

更新:这似乎是我使用 MSVC 2017.5 的限制,它阻止我使用 auto在 Kerrek 建议的模板参数列表中。我想知道是否有一些“hack”可以在没有此功能的情况下获得相同的效果。

最佳答案

当然,使用 auto 并部分特化:

template <auto F> struct X;

template <typename T, void (*F)(T)> struct X<F>
{
    // ...
};

用法:

void f(int);

X<f> x;   // deduces T = int, F = f in the partial specialization

关于c++ - 从依赖的非类型模板参数自动推导类型模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47362021/

相关文章:

c++ - 阻止对文件的访问

C++ vector 的 vector

c++ - 如何在参数包中找到最大值?

c++ - 通用模板函数总是返回整数值

c++ - 定义需要在运行时设置的 const static

c++ - 如何通过将 const 和非常量成员函数输入到模板中来避免代码重复

c++ - 如何根据模板类型启用继承开关

python - 如何统计模板匹配检测到的对象数量?

c++ - 关于在模板类中声明友元模板函数的问题(C++)

c++ - 使用 boost::hana 创建一个大的编译时间映射