2015-05-30 16 views
6

Biểu thức thời gian biên dịch là tốt vì bạn có thể sử dụng chúng để chuyên mẫu. Vì vậy, ví dụ, tuple có thể được truy cập bằng cách sử dụng một biểu thức thời gian biên dịch với phương thức std::get.Một hàm chỉ chấp nhận các biểu thức đã biết thời gian biên dịch?

std::cout << std::get<0>(my_tuple) << std::endl; 

Bây giờ, khái niệm trên là khá xấu xí. Tôi cố gắng để phát triển một số loại tuples bản thân mình (hy vọng để làm cho nó để biến chúng thành các từ điển thời gian biên dịch), do đó, nói rằng, họ phơi bày một phương pháp trong các hình thức:

my_dict.get<0>(); 

Bây giờ, những gì tôi muốn cần làm là thay thế bằng toán tử []. Tôi đã tự hỏi liệu điều đó có thể xảy ra hay không. Trước hết, tôi sẽ không biết làm thế nào để chỉ chọn hằng số, biên dịch các biểu thức được biết đến như các tham số cho toán tử của tôi. Hơn nữa, kiểu trả về sẽ phụ thuộc vào giá trị của biểu thức hằng số.

Với xác định, tuy nhiên, tôi có thể nhận được gần gũi hơn với những gì tôi muốn với một cái gì đó giống như

#define item(x) get<x>() 

vì vậy mà tôi sau đó có thể sử dụng

my_dict.item(0) 

Có cách nào để có được một cái gì đó tốt hơn so với điều này?

+9

Tôi hoàn toàn không hiểu mục tiêu của bạn. Chỉ chấp nhận đối số dưới dạng đối số mẫu. Sự cố đã được giải quyết ... –

+2

Các chữ cái do người dùng xác định để dễ dàng xác định các đối tượng 'std :: integral_constant'? http://coliru.stacked-crooked.com/a/f8450185699979be – dyp

+0

@LightnessRacesinOrbit: bạn không thể biến đối số 'operator []' thành đối số mẫu. – doublep

Trả lời

2

Cách tiếp cận này sử dụng các loại để chuyển chỉ mục, sau đó được chuyển đến operator[], trong đó trích xuất chỉ mục.

template<std::size_t n> 
using idx_t=std::integral_constant<std::size_t, n>; 
template<std::size_t n> 
idx_t<n> idx; 

constexpr int square(int x) { return x*x; } 
constexpr int power(int base, size_t pow) { 
    return (pow==0)?1: 
    (pow==1)?base: 
     (
     square(power(base, pow/2)) 
      *((pow%2)?base:1) 
    ); 
} 

template<char... cs> 
struct helper:idx_t<0>{}; 
template<char c0, char...cs> 
struct helper<c0, cs...>:idx_t< (c0-'0') * power(10, sizeof...(cs)) + helper<cs...>{} > {}; 

template<char...cs> 
constexpr idx_t< helper<cs...>{} > operator""_idx() { return {}; } 

struct foo { 
    template<std::size_t n> 
    void operator[](idx_t<n>) const { 
    char arr[n]; 
    std::cout << sizeof(arr) << '\n'; 
    } 
}; 

Có 3 (tương đương, lên đến đường cú pháp) cách sử dụng này:

foo f; 
f[idx_t<1>{}]; 
f[idx<2>]; 
f[3_idx]; 
f[1337_idx]; 

live example. Hỗ trợ cho 0xff_idx vv còn lại là một bài tập.

Các vấn đề liên quan