我只是好奇:
在下面的示例中,我将代表/*implicit*/
展示我的意思。
是否有解决方法将其留空?你可以看到,typename T不能是第一个。
template<typename C1, typename C2, typename T = decltype(typename C1::value_type() * typename C2::value_type())>
T dot(const C1 &v1, const C2 &v2);
int main()
{
std::vector<float> vec1;
std::vector<double> vec2;
// typical:
auto result1 = dot(vec1, vec2); // auto -> double
// avoid numerical unstable situations:
auto result2 = dot</*implicit*/,/*implicit*/,long double>(vec1, vec2); // auto -> long double
//auto result2 = dot<decltype(vec1),decltype(vec2),long double>(vec1, vec2);
}
在最后一行中,我提供的解决方案不是超级膨胀。
答案 0 :(得分:4)
只需对参数重新排序,然后进行条件化:
// short notation for `std::declval<typename C::value_type&>()`
template<class C>
typename C::value_type& value_in();
// if T == void, find actual result type, else use T
template<class T, class C1, class C2>
using DotResult = typename std::conditional<std::is_void<T>::value,
decltype(value_in<C1>() * value_in<C2>()), T>::type;
// void can't be a valid value_type
template<class T = void, class C1, class C2>
DotResult<T,C1,C2> dot(C1 const& c1, C2 const& c2);
但是,我必须承认......我真的没有看到它的使用 - 你可以改为转换结果,或隐式转换它...... long double x = dot(v1, v2);