Một mẫu biến có thể được chuyển qua làm đối số mẫu mẫu không?


11

Ví dụ vô nghĩa sau đây không biên dịch, nhưng có một số cách khác để truyền một mẫu biến như một đối số mẫu khuôn mẫu?

template<typename T>
constexpr auto zero = T{0};

template<typename T, template<typename> auto VariableTemplate>
constexpr auto add_one()
{
    return VariableTemplate<T> + T{1};
}

int main()
{
    return add_one<int, zero>();
}

Thử trên Trình biên dịch Explorer

Câu trả lời:


3

Câu trả lời ngắn gọn: Không.

Câu trả lời dài: Có, bạn có thể sử dụng một số hướng dẫn thông qua một mẫu lớp:

template<typename T>
constexpr auto zero = T{0};

template<typename T>
struct zero_global {
    static constexpr auto value = zero<T>;
};

template<typename T, template<typename> class VariableTemplate>
constexpr auto add_one()
{
    return VariableTemplate<T>::value + T{1};
}

int main()
{
    return add_one<int, zero_global>();
}

Ví dụ sống


có vẻ hơi lạc hậu rằng người ta phải dùng đến cấu trúc với thành viên tĩnh. Đây có phải là một cái gì đó người ta có thể mong đợi để đi kèm với một tiêu chuẩn trong tương lai? Bất cứ ý tưởng tại sao nó không có khả năng đã có ngày hôm nay?
idclev 463035818

1
@ trước đây là Unknown_463035818 Tôi không nghĩ có ai đề xuất nó (chưa bao giờ nhìn thấy nó trong bài báo, có lẽ tôi đã bỏ lỡ nó?) Và cũng có một sự phức tạp. Ngay bây giờ, tham số mẫu không phải là giá trị pr. Nhưng điều đó value<T>có nghĩa là gì? Một tham chiếu đến các biến toàn cầu? Ngoài ra, bạn không thể ODR sử dụng tham số mẫu không phải loại, nhưng bạn có thể với mẫu toàn cầu.
Trường đua Guillaume

cảm ơn về các gợi ý, tôi vẫn đang sử dụng c ++ 11, vì vậy tôi không quá quen thuộc với các mẫu biến và đó là điều mà tôi dự kiến ​​sẽ làm việc ngoài hộp
idclev 463035818
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.