この小さな例では、2番目のパラメータのテンプレート引数を自動的に推論するようにコンパイラを設定しようとしています。これは機能しますが、私が望むように簡潔ではありません。std :: functionメンバ属性のテンプレート引数減算
struct Student {
AgeCategory age;
Income income;
bool is_student;
CreditRating credit_rating;
bool buys_computer;
};
// This works (A)
template<typename R>
auto calc_mean(const std::vector<Student> & in, std::function<R (Student const&)> attr)-> double
{
const auto mean = std::accumulate(std::begin(in), std::end(in), 0.0, [&attr](auto acc, const auto& val) {
// Call the attribute passed in
return acc += static_cast<double>(attr(val));
})/static_cast<double>(in.size());
return mean;
}
// This doesn't work (B)
template<typename T>
auto calc_mean(const std::vector<Student> & in, T attr)-> double
{
const auto mean = std::accumulate(std::begin(in), std::end(in), 0.0, [&attr](auto acc, const auto& val) {
// Call the attribute passed in
return acc += static_cast<double>(attr(val));
})/static_cast<double>(in.size());
return mean;
}
// Caller (A) - works but I have to explicitly state the attribute type
mean_stddev<AgeCategory>(buy, &Student::age);
// Caller (B) - what I'd like to be able to do and let compiler infer types
mean_stddev(buy, &Student::age);
エラーは、私はより簡潔な構文で動作するようにBのための関数の宣言にしなければならない何
>..\src\Main.cpp(16): error C2672: mean_stddev': no matching overloaded function found
1>..\src\Main.cpp(16): error C2784: 'std::tuple<double,double> mean_stddev(const std::vector<Student,std::allocator<_Ty>> &,T *)': could not deduce template argument for 'T *' from AgeCategory Student::* '
1> with
1> [
1> _Ty=Student
1> ]
1> c:\users\chowron\documents\development\projects\ml\src\Bayes.h(25): note: see declaration of mean_stddev'
です。
私は起動について知らなかった。 MSVC15でも動作するようです。 Thanks – Ronnie
C++ 11のkludgeは 'std :: ref(attr)(s)'です。 –
@ T.C。それだけで私は悲しいです。私は指針 - メンバー提案を書き直し、それを再提出する必要があります。私は本当に 'attr(s) 'を書いています。 – Barry