2012-12-17 17 views
8

Xét đoạn mã sau:Buộc một tình trạng quá tải cụ thể khi mẫu template

#include <iostream> 
#include <vector> 
#include <type_traits> 

// Version A 
template<typename T> 
void f(const T& x) 
{ 
    std::cout<<"Version A"<<std::endl; 
} 

// Version B 
template<template<typename> class T, typename T1> 
void f(const T<T1>& x) 
{ 
    std::cout<<"Version B"<<std::endl; 
} 

// Main 
int main(int argc, char* argv[]) 
{ 
    f(double()); 
    f(std::vector<double>()); // <- How to force the use of version B ? 
    return 0; 
} 

Theo mặc định, nó sẽ tạo ra:

Version A 
Version A 

Làm thế nào để buộc việc sử dụng Version B khi loại thông qua là một mẫu mẫu với hình dạng tốt (tôi có thể thêm phiên bản mới của f, tôi có thể thêm std::enable_if hoặc cú pháp đặc điểm loại C++ 11 khác, nhưng nếu có thể tôi muốn tránh thêm lớp trợ giúp)?

Trả lời

11

std::vector không lấy một tham số typename duy nhất, phải mất 2! Đừng quên người cấp phát.

Do đó, sử dụng các mẫu variadic:

template<template<typename...> class T, typename T1> 
void f(const T<T1>& x) 
{ 
    std::cout<<"Version B"<<std::endl; 
} 

Bây giờ nó hoạt động như bạn muốn.

1

Khi Pubby giải thích trong his answer, std :: vector là một mẫu có hai tham số, do đó hàm quá tải của bạn cần phải lấy nhiều tham số mẫu hơn. Nếu bạn không muốn sử dụng các mẫu variadic, thì bạn cần đặt đúng số tham số:

#include <iostream> 
#include <vector> 
#include <type_traits> 


// Version A 
template<typename T> 
void f(const T&) 
{ 
    std::cout<<"Version A"<<std::endl; 
} 

// Version B 
template<template<typename,typename> class T, typename T1,typename T2> 
void f(const T<T1,T2>&) 
{ 
    std::cout<<"Version B"<<std::endl; 
} 

template<typename T> 
void baa(const T&) 
{ 
} 

// Main 
int main() 
{ 
    f(double()); 
    f(std::vector<double>()); // <- How to force the use of version B ? 
} 
Các vấn đề liên quan