C ++의 Boost.MultiArray에 대한 사인 템플릿 함수
이것은 An element_wise_add Function For Boost.MultiArray in C ++에 대한 후속 질문입니다 . 각 요소에 적용되는 기본 추가 작업 외에도 각 요소에 적용 할 수있는 사인 템플릿 기능을 구현하려고합니다 std::sin(). with_std_sin아래와 같이 새로운 개념 이 만들어집니다.
template<typename T>
concept with_std_sin = requires(T x)
{
std::sin(x);
};
이 sin템플릿 기능의 본문 은 여기에 있습니다. 모든 요소를 통과하기 위해 유사한 재귀 기술도 사용됩니다.
template<class T> requires (with_std_sin<T>)
auto sin(const T& input)
{
return std::sin(input);
}
template<class T> requires (is_multi_array<T>)
auto sin(const T& input)
{
boost::multi_array output(input);
for (decltype(+input.shape()[0]) i = 0; i < input.shape()[0]; i++)
{
output[i] = sin(input[i]);
}
return output;
}
이 sin템플릿 기능 의 테스트 :
// Create a 3D array that is 3 x 4 x 2
typedef boost::multi_array<double, 3> array_type;
typedef array_type::index index;
array_type A(boost::extents[3][4][2]);
// Assign values to the elements
int values = 1;
for (index i = 0; i != 3; ++i)
for (index j = 0; j != 4; ++j)
for (index k = 0; k != 2; ++k)
A[i][j][k] = values++;
for (index i = 0; i != 3; ++i)
for (index j = 0; j != 4; ++j)
for (index k = 0; k != 2; ++k)
std::cout << A[i][j][k] << std::endl;
auto test_result = sin(A);
for (index i = 0; i != 3; ++i)
for (index j = 0; j != 4; ++j)
for (index k = 0; k != 2; ++k)
std::cout << test_result[i][j][k] << std::endl;
모든 제안을 환영합니다.
어떤 질문에 대한 후속 조치입니까?
지난 질문 이후 코드에서 어떤 변화가 있었습니까?
이전 질문은 Boost.MultiArray의 각 요소에 추가 작업을 적용하는 구현입니다. 이 질문의 주요 아이디어
sin는 각 요소의 삼각 사인 값을 계산 하기위한 템플릿 함수 를 구현하는 것 입니다.새로운 리뷰가 요청되는 이유는 무엇입니까?
제 생각에는 이것이
with_std_sin여기 에서 개념 의 구현 및 사용에 대한 좋은 아이디어인지 확실하지 않습니다 . 개선 사항이 있으면 알려주십시오.
답변
매우 간단하고 깨끗해 보입니다. with_std_sin그래도 이름을 바꿀 것 입니다. 이름을 지정 해야한다고 제안하는 이름 지정 개념에 대한 몇 가지 지침 이 있습니다 sinable. 약간 이상해 보이지만 "std :: sin이 지원하는 것"을 설명 할 수있는 모든 것이 어떤면에서 이상해 보이므로 어떤 이름만큼이나 좋습니다.
그러나 .NET boost::multi_array뿐만 아니라 의 내용에 다른 많은 기능을 적용 할 수도 있습니다 std::sin. 이 경우 s recursive_transform()를 처리 하는 a 가 multi_array갈 길이므로 "그냥"다음과 같이 작성할 수 있습니다.
auto test_result = recursive_transform(A, [](auto &x){return std::sin(x);});
또는 정의하는 것을 이상 사용에서 sin(), cos()의 therms에에 그래서 recursive_transform()코드를 복제 할 필요없이.