Làm thế nào để thực hiện sự khác biệt mang tính biểu tượng sử dụng các mẫu biểu trong C++biệt tượng trưng sử dụng các mẫu biểu trong C++
Trả lời
Nói chung bạn muốn một cách để thể hiện biểu tượng của bạn (tức là biểu mẫu mà mã hóa ví dụ 3 * x * x + 42
), và một meta - chức năng có thể tính toán một đạo hàm. Hy vọng rằng bạn đủ quen thuộc với lập trình meta trong C++ để biết điều đó có nghĩa và đòi hỏi nhưng để cung cấp cho bạn một ý tưởng:
// This should come from the expression templates
template<typename Lhs, typename Rhs>
struct plus_node;
// Metafunction that computes a derivative
template<typename T>
struct derivative;
// derivative<foo>::type is the result of computing the derivative of foo
// Derivative of lhs + rhs
template<typename Lhs, typename Rhs>
struct derivative<plus_node<Lhs, Rhs> > {
typedef plus_node<
typename derivative<Lhs>::type
, typename derivative<Rhs>::type
> type;
};
// and so on
Sau đó bạn muốn trói hai phần (đại diện và tính toán) như vậy mà nó sẽ là thuận tiện để sử dụng. Ví dụ. derivative(3 * x * x + 42)(6)
có thể có nghĩa là 'tính đạo hàm của 3 * x * x + 42
trong x ở 6'.
Tuy nhiên ngay cả khi bạn biết phải mất những gì để viết các mẫu biểu thức và những gì nó cần để viết một metaprogram trong C++ tôi sẽ không khuyên bạn nên đi theo nó theo cách này. Lập trình meta mẫu yêu cầu nhiều bản mẫu và có thể tẻ nhạt. Thay vào đó, tôi hướng dẫn bạn đến thư viện thiên tài Boost.Proto, được thiết kế chính xác để giúp viết EDSL (sử dụng các mẫu biểu thức) và hoạt động trên các mẫu biểu thức đó. Nó không nhất thiết phải dễ dàng để tìm hiểu để sử dụng nhưng tôi đã tìm thấy rằng việc học cách để đạt được cùng một điều mà không sử dụng nó là khó hơn. Dưới đây là một chương trình mẫu mà có thể trên thực tế hiểu và tính toán derivative(3 * x * x + 42)(6)
:
#include <iostream>
#include <boost/proto/proto.hpp>
using namespace boost::proto;
// Assuming derivative of one variable, the 'unknown'
struct unknown {};
// Boost.Proto calls this the expression wrapper
// elements of the EDSL will have this type
template<typename Expr>
struct expression;
// Boost.Proto calls this the domain
struct derived_domain
: domain<generator<expression>> {};
// We will use a context to evaluate expression templates
struct evaluation_context: callable_context<evaluation_context const> {
double value;
explicit evaluation_context(double value)
: value(value)
{}
typedef double result_type;
double operator()(tag::terminal, unknown) const
{ return value; }
};
// And now we can do:
// evalutation_context context(42);
// eval(expr, context);
// to evaluate an expression as though the unknown had value 42
template<typename Expr>
struct expression: extends<Expr, expression<Expr>, derived_domain> {
typedef extends<Expr, expression<Expr>, derived_domain> base_type;
expression(Expr const& expr = Expr())
: base_type(expr)
{}
typedef double result_type;
// We spare ourselves the need to write eval(expr, context)
// Instead, expr(42) is available
double operator()(double d) const
{
evaluation_context context(d);
return eval(*this, context);
}
};
// Boost.Proto calls this a transform -- we use this to operate
// on the expression templates
struct Derivative
: or_<
when<
terminal<unknown>
, boost::mpl::int_<1>()
>
, when<
terminal<_>
, boost::mpl::int_<0>()
>
, when<
plus<Derivative, Derivative>
, _make_plus(Derivative(_left), Derivative(_right))
>
, when<
multiplies<Derivative, Derivative>
, _make_plus(
_make_multiplies(Derivative(_left), _right)
, _make_multiplies(_left, Derivative(_right))
)
>
, otherwise<_>
> {};
// x is the unknown
expression<terminal<unknown>::type> const x;
// A transform works as a functor
Derivative const derivative;
int
main()
{
double d = derivative(3 * x * x + 3)(6);
std::cout << d << '\n';
}
Lưu ý: điều này không biên dịch trên studio hình ảnh 2015. –
- 1. Thư viện tính toán tượng trưng trong tinh khiết C
- 2. Formatting tệ sử dụng mẫu trưng bày trong MVC
- 3. Tượng trưng các nhật ký sự cố trong XCode 4.3.2
- 4. Có thể tượng trưng cho mã C++ không?
- 5. Có thể sử dụng các biểu tượng biên dịch có điều kiện trong các mẫu T4
- 6. Biểu diễn ngữ nghĩa (hoặc tượng trưng) của Âm nhạc
- 7. Sử dụng FOSRestBundle với các biểu mẫu
- 8. Sử dụng các biểu tượng jQuery UI
- 9. sử dụng mẫu MVC MVP trong biểu mẫu thắng
- 10. Emacs và các liên kết tượng trưng
- 11. Mẫu biểu mẫu Django sử dụng biểu mẫu.ModelMultipleChoiceField
- 12. Sử dụng R để diễn giải một công thức tượng trưng để sử dụng bên ngoài
- 13. Bạn có thể sử dụng các biểu mẫu chung trong C# không?
- 14. Sử dụng các biểu tượng trong tùy chọn Android
- 15. Sử dụng biểu tượng @ trong strings.xml
- 16. Mẫu biểu thức C++
- 17. Làm cách nào để sử dụng các mẫu tùy chỉnh trong các biểu mẫu Backbone?
- 18. Cách sử dụng Mẫu biểu thức
- 19. Liên kết tượng trưng trong windows XP
- 20. Cách sử dụng UserControl trong Lập trình biểu mẫu cửa sổ C#
- 21. Trình biên dịch không theo các liên kết tượng trưng trong Visual Studio C++
- 22. Mẫu MVP sử dụng biểu mẫu web và phân giải đối tượng DI
- 23. Bỏ qua các liên kết tượng trưng trong .gitignore
- 24. Xóa các liên kết tượng trưng trong PHP
- 25. Có biểu trưng chính thức của C# không?
- 26. Mẫu đối tượng null chung trong C#
- 27. C#: Biểu mẫu kính?
- 28. File.Copy() và Liên kết tượng trưng
- 29. Sử dụng các mẫu trong excel với C#
- 30. sử dụng knockout.js với các biểu mẫu django?
Bạn kinda ... uhm ... không – Mehrdad
@Mehrdad LMAO, Tự hỏi, nếu anh ấy biết những gì ông thực sự yêu cầu. – johnathon
Tôi cũng muốn biết cách thực hiện nó. – coderboy