Tôi có một mẫu tem class
(gọi là Foo
) có một số chuyên môn. Tôi muốn quá trình biên dịch thất bại nếu ai đó cố gắng sử dụng phiên bản không chuyên biệt của Foo
.Làm cách nào để ngăn chặn việc tạo mẫu không chuyên biệt?
Dưới đây là những gì tôi thực sự có:
template <typename Type>
class Foo
{
Foo() { cannot_instantiate_an_unspecialized_Foo(); }
// This method is NEVER defined to prevent linking.
// Its name was chosen to provide a clear explanation why the compilation failed.
void cannot_instantiate_an_unspecialized_Foo();
};
template <>
class Foo<int>
{ };
template <>
class Foo<double>
{ };
Vì vậy mà:
int main()
{
Foo<int> foo;
}
trình khi:
int main()
{
Foo<char> foo;
}
Liệu không.
Rõ ràng, chuỗi trình biên dịch chỉ phàn nàn khi quá trình liên kết diễn ra. Nhưng có cách nào để làm cho nó phàn nàn trước?
Tôi có thể sử dụng boost
.
Cảm ơn bạn rất nhiều. Tôi đoán tôi đang tìm thứ gì đó quá phức tạp. – ereOn
@Schnommus Nhưng nếu bạn định nghĩa lớp và nó có một static_assert, không nên nó không bao giờ được khởi tạo bởi vì chuyên môn phù hợp hơn? –
Đó là quyết định tồi, vì lỗi sẽ được phát hành trên liên kết giai đoạn, không phải trên biên dịch. Và bạn sẽ không bao giờ biết chính xác bạn đã sử dụng lớp học không chuyên môn ở đâu. – vladon