클래스 템플릿에서 자신의 타입을 제외한 타입을 매개변수의 타입으로 사용하는 방법은 없을까요?

dltkddyd의 이미지

제가 동적배열을 만들고 있습니다. 기존에 만든 것도 있긴 한데 속도나 몇 가지 결함이 있어서 다시 만들고 있습니다. 제가 만들려고 하는 것이 표준라이브러리에 있는 vector입니다. 제가 직접 만들면서 원리를 알아내려 하고 있는데 다음과 같은 사안에서 제동이 걸립니다.

클래스는 다음과 같이 선언했습니다.

template
class Svector

그리고 Svector를 멤버함수의 매개변수 타입으로 사용하려고 합니다. 단 x에는 Svector가 다시 언급될 수 없습니다. 즉 x는 기본타입이거나 다른 Svector를 제외한 타입이어야 합니다. 만약 만들고자 하는 멤머함수가 ff라면 다음과 같이

void ff(Svector<x>& src) {
 //진술문
}

Svector<x>를 언급하려 하는데, 저 x를 어떻게 언급해주어야 할까요?

klara의 이미지

Svector의 템플릿 인자와, Svector::ff가 받는 인자 src의 템플릿 인자가 다르다는 건가요?

dltkddyd의 이미지

가능할까요?

본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.

kukyakya의 이미지

template <class T>
struct is_Svector : std::false_type { };
 
template <class T>
struct is_Svector<Svector<T> > : std::true_type { };
 
template <class x>
std::enable_if<!is_Svector<x>::value, void> ff(Svector<x>& src) {
}

실행해보진 않았지만 개념적으로는 위와 같이 구성하시면 될 것 같습니다. C++11을 사용중이신 것이 아니라면 boost::enable_if를 사용하시면 됩니다.

어떤 기능에 어떤 구현을 생각하시는지는 모르겠습니다만 궁금한 점을 좀 여쭙고 싶은데, 벡터의 벡터를 만들어야할 경우도 있을텐데 x 타입에 왜 Svector가 들어가면 안되는지 잘 모르겠습니다.

그리고 VC++이나 gcc나 벡터에 속도 결함이 있다고 할 정도로 실행속도가 느려질만한 부분이 없는 것 같은데 어떤 부분에 결함이 있다고 생각하시는건가요?

dltkddyd의 이미지

마지막 x가 Svector가 아닌 경우를 오버로딩해서 별도의 처리를 할 필요가 있던데요. 그러니까 마지막 x는 Svector가 아닌데, 재귀적으로 계속 같은 함수를 호출하다 보면 x에는 멤버에 없는 Svector의 멤버를 호출하게 되는 문제요. 그래서 오버로딩해 처리할 필요가 있기에...

if... else...

구문으로 typeid를 섞어서 함수를 호출했더니 멤버가 없다며 계속 컴파일 오류가 발생했습니다.

그리고 표준 vector는 탁월하게 잘 작동합니다. 제가 예전에 만들었던 동적 배열이 문제였고요.

본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.

dltkddyd의 이미지

언급하신 enable_if 템플릿 정말 막강한 클래스네요. enable_if 를 조금 응용했더니 고민했던 문제가 풀렸습니다. 정말 감사합니다. 그런데

enable_if<> 다음에

::type을 언급해주어야 하는거죠.

본인 맞습니다.
인증샷
우헤헤헤... 로 대신합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.