728x90
300x250

[심심풀이(pastime)] 가정집 - 커튼 설치하기 with 치수측정

 

이번에 다뤄볼 내용은 실질적인 집에서 커튼을 어떻게 기장을 맞추고, 측정하고, 설치하는 지에 대해서 다뤄보고자 한다.


1. 목차

아래의 순서대로 다뤄보았다.

 

 


2. 환경 - 자연환경에 대한 사항

꼭 읽어보기 바란다.

 


3. 소개

작업 방법에 대해서 소개하였다.

 

 


4. 첨부(Attachment) - 문서양식(Document Template)

210428_measuring_dimensions_and_installing_curtains_template.z01
10.00MB
210428_measuring_dimensions_and_installing_curtains_template.zip
7.35MB

(Mozilla Public License v2.0을 적용받는다.)

 


5. 첨부(Attachment) - 커튼 설치

210428_measuring_dimensions_and_installing_curtains_template.zip
7.35MB

(MPL(mozilla public License v2.0을 적용받는다.)

 


6. 맺음글(Conclusion)

치수 측정 및 커튼 설치에 대해서 자세히 살펴보았다.

 


* 참고자료(Reference)

1. 

반응형
728x90
300x250

[C, C++] Header와 템플릿의 명시적 특수화

 

C, C++에서 Template라는 개념은 <int>, <string>, <char> 등의 다양한 자료형의 함수를 두 번 생산하지 않고, 재사용을 한다는 장점을 통해, 개발 인력의 최소화로 긍정적인 부분을 보여준다고 할 수 있습니다.

이러한 Template는

 

#include < iostream >

 

using namespace std;

 

template <typename T>

class dd{


}

 

int main(){

 

 

이같은 꼴로 사용할 수 있습니다.

 

이러한 템플릿에서 명시적 특수화에 대해 잠시 소개하려고 합니다.

Explicit Specialization은 전체 특수화를 기본 특징으로 갖는 언어를 말합니다.

 

어려운 개념은 아닌데, 잘못 사용하면, 어려워지는 개념이 이 부분이 아닐까 싶습니다.

 

 template <typename T> class Invalid { 
 }; 

InVaild<double> x1;    // Invalid<double> 인스턴스화 시킴

template<> 
class Invalid<double>; // 에러: Invalid<double> 이미 인스턴스화 됨

 

위험하게 구성된 코드입니다. 흔히들 작업하다보면, 이와 같은 쓰레기 코드를 만들 수 있는데, 참조수준의 문제로 시스템에 중대한 오류를 발생시킬 수 있습니다.

 

기본적인 원칙을 구하고 사용하자.

 

template <typename T>

 class Invalid { 

       void aa(); 
 }; 

(정의)

 

template <typename T>

void Invalid<T>::aa()
{

}

(선언)

 

 

이의 경우, void 형의 aa() 함수를 선언하고 정의한 예시입니다.

기본적인 이의 구조는 당연한 Template를 생성하는 기본 원칙입니다.

 

template <typename T>

 class Invalid { 

       void aa(T data); 
 }; 

(정의)

 

template <typename T>

void Invalid<T>::aa(T data)
{

}

(선언)

 

template <>

void Invalid<char>::aa(char data)
{

}

(명시적 특수화)

 

 

T보다 특수화가 앞서 선언될 수 없다는 점을 명확히 할 필요가 있습니다.

아래는 가능한 사례를 몇 개 소개해드리고자 합니다.

 

template <typename T, typename D>

 class Invalid { 

       void aa(T data1, D data2); 
 }; 

(정의)

 

template <typename T, typename D>

void Invalid<T>::aa(T data1, D data2)
{

}

(선언)

 

template <char, int>

void Invalid<char, int>::aa(char data1, int data2)
{

}

(명시적 특수화)

 

 

이의 경우에는 명시적 특수화에서 오류가 날 수밖에 없습니다.

template <char, int>라고 쓴 부분은 template 함수를 생성하는 자료형이 와야 맞는데 General Data Type이 오기 때문에 오류가 날 수밖에 없습니다.

 

#include <iostream>
template <typename T, typename D>
class test{
public:
 void aa(T data1, D data2);
};
template <typename T, typename D>
void test<T, D>::aa(T data1, D data2){
 std::cout << "T, D";
 std::cout << std::endl;
 std::cout << data1 << "," << data2;
 std::cout << std::endl;
}
template <>
void test<char, int>::aa(char data1, int data2)
{
 std::cout << "T, D";
 std::cout << std::endl;
 std::cout << data1 << "," << data2;
 std::cout << std::endl;
}
int main(){
 test<double, int> aaaa;
 aaaa.aa(1.22, 1);
 test<char, int> bbbb;
 bbbb.aa('a', 1);
}

 

출력

T, D
1.22,1
T, D
a,1

 

 


1. 추천 사이트


1. https://wikidocs.net/488

 

반응형
728x90
300x250
[C++] C++ Template Class 헤더 분리

 

Template Class를 헤더로 분리하는 방법은. inl 파일로 분리해서 하는 방법이 있다.
대형 3D엔진에서는. inl이란 파일 형식으로 CPP 파일 대신해서 사용한다.
사실 템플릿 함수 자체가 함수를 만들어내는 임무를 수행하고 있다.

 

일반 함수 원형의 경우,

int hama(int a, int b)

{

       a + b

}

 

이런 꼴이라고 가정하면

템플릿 자료형(int, char 등..) hama(템플릿 자료형 a, 템플릿 자료형 b)

{

     a + b;

}

 

이런 식으로 함수 원형 틀은 그대로 두되 자료형을 자유롭게 바꿔낼 수 있다.

Header라는 영역에서밖에 못 사용하는 것도 아무래도 이러한 이유가 있기 때문에 그러지 않을까 생각한다.

결론은 분리하는 방법은 편법답게 하는 방법이 있는데,
첫 번째로, header를 header 1, header 2로 분리하는 방법

 

헤더 1이에요

class 헤더1{

 

}

 

#include "헤더1.h"

 


두 번째로, header를 inl으로 맨 하단에 #include를 시키는 방법이 될 수 있다.

 

나 헤더

 

class 멍청한클래스{

 

}

 

#include "aaa.inl"

 

/// aaa.inl

구현 하시죠.ㅋㅋㅋ

 

그냥 실험하는 목적이거나 단순한 거면, 헤더 파일 하나에 몰아넣는 게 정신건강에 이롭지 않나 생각한다.

반응형

+ Recent posts