假设我们要编写一个函数,该函数应该获取一个值作为模板参数(例如,出于效率原因),但我们事先不知道我们期望的参数类型。可以将其实现为
template<typename T, T val>
func() { cout << val; }
然而,调用这样的函数并不好玩
func<int, 5>()
是否可以重写 func s.t.可以这样调用吗?
func<5>()
最佳答案
主要取决于您的实际功能的解决方案是按如下方式定义它:
template<typename T>
constexpr void func(T val) { }
然后调用它作为 f(5)
并从函数本身的参数中推导出模板参数。
否则,在 C++14 中,您无法避免使用 template<typename T, T value>
模式.
它与标准模板库使用的模式相同,请参见 std::integral_constant
的定义示例.
减轻(也许)样板的可能解决方案是基于结构的使用,例如:
template<typename T>
struct S {
template<T value>
static void func() {}
};
你可以这样做:
using IntS = S<int>;
// ....
IntS::func<5>();
在即将发布的 C++17 修订版中,您将设法按如下方式进行:
template<auto value>
void func() {}
这可以调用为 f<5>()
,这就是您要找的..
关于未知类型的 C++ 模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39335519/