Sử dụng _1, _2, ... trực tiếp là không thể với mẫu variadic. Thay vào đó, bạn cần phải sử dụng macro mở rộng.
Tuy nhiên, bạn có thể bao bọc các phần giữ chỗ trong một nhà máy có khuôn mẫu để lấy _1 với đối số mẫu 1, _2 cho 2, v.v ...
Triển khai như gcc/msvc đã xác định placeholders struct như templated (tương ứng std :: _ Placeholder và std :: _ Ph), do đó bạn có thể xác định bạn nhà máy theo cách này:
struct ph_factory {
template<size_t holder>
static std::_Placeholder<holder> make_ph() {
return std::_Placeholder<holder>();
}
};
này được xác định, bạn có thể mở rộng một gói thông số với tất cả các placeholders bạn muốn:
struct tester {
template<size_t ... holders>
void test(int val) {
auto callable = std::bind(&tester::call, this, val, ph_factory::make_ph<holders>()...);
callable('a', 42, 'c');
}
void call(int v1, char c1, int v2, char c2) {
cout << "calling :" << v1 << " " << c1 << " " << v2 << " " << c2 << endl;
}
};
Vì vậy, các mã sau đây sẽ đưa ra "gọi: 10 c 42 một"
int main() {
tester t;
t.test<3,2,1>(10);
}
Sử dụng các thủ thuật như make_indice sẽ cho bạn khả năng đạt được mục tiêu ban đầu của bạn.
Có một triển khai tốt đẹp về tiện ích make_indice tại đây: [http://preney.ca] (http://preney.ca/paul/2011/10/16/applying-stdtuple-to-functors-efficiently/) nhưng tôi đang gặp khó khăn trong việc tìm ra cách tôi có thể sử dụng nó với boost :: arg <> – Blizter
Liên kết đó đã được đọc rất tốt, và hàm 'apply (Func, std :: tuple)' có thể có ích vào một ngày nào đó . –
Tôi thấy 'typename ... Args'. Bạn đang sử dụng C++ 11? – kennytm