ben variadic şablonları genel bir sınıf yöntemini kabul ve çağırmak için kullandığı bir call
fonksiyonu var aşağıdaki C++ 11 örnek var: kodunda yorumladığı gibitutarsız parametre paketi indirimi
#include <utility>
template <typename T, typename R, typename... Args>
R call(R (T::*fn)(Args...), T *t, Args&&... args) {
return ((*t).*fn)(std::forward<Args>(args)...);
}
class Calculator {
public:
int add(const int& a, const int& b) {
return a + b;
}
};
int main() {
Calculator *calculator = new Calculator();
int* a = new int(2);
int* b = new int(4);
// compiles
int res1 = calculator->add(*a, *b);
// does not compile!
int res2 = call<Calculator>(&Calculator::add,calculator, *a, *b);
return 0;
}
, int
işlevini, const int
kabul ettiğinde, yönlendirme yöntemini arayabiliyorum. Düzenli yürütme ile karşılaştırıldığında
error: no matching function for call to ‘call(int (Calculator::*)(const int&, const int&), Calculator*&, int&, int&)’
int res2 = call<Calculator>(&Calculator::add,calculator, *a, *b);
^
inconsistent parameter pack deduction with ‘const int&’ and ‘int&’
int res2 = call<Calculator>(&Calculator::add,calculator, *a, *b);
^
C++ variadic şablon sıkı tür denetlemesi zorlamak mı: Aşağıdaki derleme hatası alıyorum? Ben C++ 11.
: * Not: Aday şablon göz ardı: parametresi için çakışan türleri çıkarılabilir 'Args' (<#define & #define &> vs.) * –
chris
Bu, türlerin variadic şablonları kullanırken tam olarak eşleşmesi gerektiği anlamına mı geliyor? – jeffreyveon
Bu, aynı şablon parametresi için farklı türler çıkaramazsınız çünkü derleyici, hangisini istediğinizi bilemez. Her zaman açık fonksiyon yakalama üzerinde atlayabilir ve sadece bir callable nesne parametresi olabilir: 'template otomatik arama (F f, T * t, Args && ... args) { dönüş (t -> * f) (std :: ileri (args) ...); } ' –
chris