模板参数推导C++

Template Argument Deduction C++

本文关键字:C++ 参数      更新时间:2023-10-16

我尝试编译以下代码行,但失败了:

template <typename T>
struct InputBlockParameterType {
    typedef T type;
};
template <typename T, template <typename> class BlockTypeTrait>
struct BlockParameterImpl {
    typedef typename BlockTypeTrait<T>::type type;
};
template <typename T>
struct InputBlockParameter {
    typedef typename BlockParameterImpl<T, InputBlockParameterType>::type type;
};

struct Functor {
    template <typename T>
    bool operator()(typename InputBlockParameter<T>::type p) {
        return true;
    }
};
int main() {
    InputBlockParameter<double>::type arg = 0.0;
    Functor f;
    f(arg);
    return 0;
}

错误是 (MSVC 2013(:

1>main.cpp(31): error C2783: 'bool Functor::operator ()(InputBlockParameter<T>::type)' : could not deduce template argument for 'T'
1>          main.cpp(21) : see declaration of 'Functor::operator ()'

如果我将函子更改为

struct Functor {
    template <typename T>
    bool operator()(T p) {
        return true;
    }
};

一切都按预期编译良好。

为什么代码的第一个版本没有编译?它是标准中定义的某个地方吗?

演绎只适用于推导的上下文。

这是无用的:X只有在X工作时才有效。 我可以引用标准,但它只是在更难阅读的散文中说"是的,那行不通"。

考虑这个问题的最好方法是编译器只执行模式匹配。 但是,它不会搜索或尝试反转您编写的任何类型映射。

foo<T>::type可以做一个图灵完备计算(达到编译器限制(从Ttype:所以标准声明使用T存在一个非推导的上下文,即使foo类型映射看起来很容易反转给你。 反转任意函数并不是要求编译器做的一件实际的事情,即使我们已经要求它们为图灵完备才能编译C++。

编译器不会转换(除了基和 cv 剥离和参数衰减(,也不会在模板类型推断期间反转类型映射。 它只是模式与参数匹配。

它将遵循SFINAE目的的类型映射,但理论上要容易得多。

如果可以自己编写逆映射,则可以混合使用 SFINAE 和默认参数以及模板类专用化和转发来获得您可能想要的效果。