c++ - 模板参数默认为后一个

标签 c++ templates c++11 function-templates default-arguments

This link没有回答我的问题所以我会在这里问:

基本上我想写一个模板函数

template <typename Out, typename In>
Out f(In x);

这里我总是需要指定Out打电话时 f .我不想每次都这样做,所以我基本上想要

template <typename Out = In, typename In>
Out f(In x);

这意味着如果我不指定 Out , 它将默认为 In .然而,这在 C++11 中是不可能的。

所以我的问题是,有什么办法可以达到这样的效果:

  1. 调用 f(t)将实例化 f<T,T>(t)或更一般地说 f<typename SomeThing<T>::type, T>
  2. 调用 f<U>(t)将实例化 f<U, T>(t)

最佳答案

您可能永远不想指定 In而是推导它,对吗?

在这种情况下你需要重载函数:

template <typename Out, In>
Out f(In x);

template <typename T>
T f(T x);

调用它:

f(42);
f<float>(42);

...但不幸的是,这对于 f<int>(42) 是模棱两可的| .不管怎样,我们可以使用 SFINAE 适本地禁用其中一个重载:

template <
    typename Out,
    typename In,
    typename = typename std::enable_if<not std::is_same<Out, In>::value>::type
>
Out f(In x);

template <typename T>
T f(T x);

为了避免实现中的冗余,让两个函数分派(dispatch)到一个共同的实现中,f_impl .

Here’s a working example:

template <typename Out, typename In>
Out f_impl(In x) {
    std::cout << "f<" << typeid(Out).name() <<
                 ", " << typeid(In).name() <<
                 ">(" << x << ")\n";
    return x;
}

template <
    typename Out,
    typename In,
    typename = typename std::enable_if<not std::is_same<Out, In>::value>::type
>
Out f(In x) {
    std::cout << "f<Out, In>(x):\t ";
    return f_impl<Out, In>(x);
}

template <typename T>
T f(T x) {
    std::cout << "f<T>(x):\t ";
    return f_impl<T, T>(x);
}


int main() {
    f(42);
    f<float>(42);
    f<int>(42);
}

关于c++ - 模板参数默认为后一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14508805/

相关文章:

c++ - 同时专门化外部和嵌套类

javascript - Django 模板存在 javascript 渲染问题

c++ - 在Doxygen中格式化参数

c++ - 寻求对 std::forward 的澄清

c++ - C++ 中的全范围比较运算符?

c++ - 错误 : ____ was not declared in this scope

c++ - 数组元素编号

c++ - 如何在 C++0x 中组合哈希值?

c++ - 错误 : "2 overloads have similar conversions"

c++ - 在 Clang++ 的 C++17 中不能禁用 RVO/NRVO?