Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ decltype可以用来确定参数的类型吗?_C++_C++11_Eigen_Decltype - Fatal编程技术网

C++ decltype可以用来确定参数的类型吗?

C++ decltype可以用来确定参数的类型吗?,c++,c++11,eigen,decltype,C++,C++11,Eigen,Decltype,我正在使用表达式模板,希望确定表达式参数的类型。表达式的名称有很多模板参数,但它们的类型可以简单地从参数的类型推断出来是否有一些技巧可以帮助我根据用于生成表达式的操作来确定表达式的类型? template<typename X1, typename X2> void foo(decltype(x1() + x2())) {} 模板 void foo(decltype(x1()+x2()){} 注意:我正在尝试为Eigen添加自动微分。是的,只需将它们设为大写: template&

我正在使用表达式模板,希望确定表达式参数的类型。表达式的名称有很多模板参数,但它们的类型可以简单地从参数的类型推断出来是否有一些技巧可以帮助我根据用于生成表达式的操作来确定表达式的类型?

template<typename X1, typename X2>
void foo(decltype(x1() + x2())) {}
模板
void foo(decltype(x1()+x2()){}

注意:我正在尝试为Eigen添加自动微分。

是的,只需将它们设为大写:

template<typename X1, typename X2>
void foo(decltype(X1() + X2()) x) {}

无论如何,这有点奇怪,你应该像下面那样调用
foo

foo<int, float>(12.5);
foo(12.5);

推断返回类型更有用:

template<typename X1, typename X2>
auto foo(X1 x1, X2 x2) -> typename std::common_type<X1,X2>::type
{
    return x1 + x2;
}
模板
自动foo(X1-X1,X2-X2)->typename std::common_type::type
{
返回x1+x2;
}

谢谢,它很有效。但是调用foo显式指定参数类型并不能真正解决问题,因为参数本身可以是表达式。您应该只通过一个模板占位符传递它:
template void foo(X){}
。在这种情况下,任何表达式都适合重载。但是我需要为foo(x+y)和foo(x-y)调用不同的函数。
x+y
x-y
将生成相同的结果类型。更好的
decltype(x1+x2)
应该用作尾部返回类型。
template<typename X1, typename X2>
auto foo(X1 x1, X2 x2) -> typename std::common_type<X1,X2>::type
{
    return x1 + x2;
}