나는 지금까지 필요한 모든 것을 제공하는 멋지고 작은 jack-all-all 거래 유형을 가지고 있습니다.C++ 생성자 및 호출 모호성 해결
template <typename T>
class Array
{
...
public:
int Data; // custom value
virtual void InitData() { Data = 0; }
Array(const Array& array);
template <typename U, typename = std::enable_if<std::is_same<U, T>::value, U>> Array(const Array<U>& array);
template <typename... Ts> Array(const Ts&... items);
void Add(const T& item);
template <typename... Ts> void Add(const T& item, const Ts&... rest);
void Add(const Array& array);
}
template <typename... Ts> Array(const Ts&... items);
날 Array<T> array = { ... }
을하고, 할당하고 {...}
초기화 목록을 반환 할 수 있습니다. 생성자 중 어느 것도 명시 적이 지 않기 때문에, 그것은 매우 편리하지만 또한 지금 당황하게 된 이유이기도합니다.
배열에 "합리적인"것을 추가하고 싶습니다.
이using Curve = Array<float2>;
class Poly : public Array<float2> { using Array::Array; void InitData() override { Data = 1; } };
class Curve2 : public Array<float2> { using Array::Array; void InitData() override { Data = 2; } };
class Curve3 : public Array<float2> { using Array::Array; void InitData() override { Data = 3; } };
위의 std::is_same<>
물건 구체적이고 같은 동일하지만 모든 곡선 처리 할 수 있도록 : 내 주요 사용 사례는 바로 지금입니다 서로 다른 정도의 곡선 유형을, 모든 것이 정적으로 "잘입니다 타입이 "이므로, DrawCurve(const Curve&)
과 같은 함수에서하는 모든 작업은 학위를 확인한 다음 적절한 조치를 취하는 것입니다. Curve
은 Array의 멋진 별칭이며 Curve2 등은 학위 전문 분야입니다. 그것은 아주 잘 작동합니다.
커브 생성을 할 때 나는 일반적으로 곡선 객체를 가지고 있는데 여기에는 점 또는 곡선 세그먼트이 추가됩니다. 그래서 할 수 있도록하고 싶습니다 : 내가 추가 호출 할 때 추가()를 가지고 있기 때문에
Curve3 curve;
curve.Add(float2()); // ambiguity
curve.Add(Array<float2>());
불행하게도, 내가 여기 모호성을 얻을 중 하나 float2
또는 잘 작동하는 Array<float2>
,하지만, 배열 암시 적 생성자 template <typename... Ts> Array(const Ts&...)
이 있으며 이는 float2
을 인수로 취할 수 있습니다. 내가
template <typename A, typename = std::enable_if<std::is_same<A, Array>::value, A>>
void Add(const Array& array);
처럼 명시 적 배열을 생성자를 만드는 시도했다 그러나 나는 등 float2하는 Curve3에서 새로운 변환 오류를 얻을하고 엉망이된다
Array::Add(float2()); // and
Array::Add(Array<float2>(float2()));
사이에 따라서 모호성이다.
내 희망은 템플릿이나 다른 C++ 제품의 깊이에 어딘가에 내가 필요한 바로 그 간단한 해결책이 있다는 것입니다. (예, 나는 AddItem() 및 :: AddArray() 메소드의 이름을 바꿀 수 있다는 것을 알고 있고, 문제는 잠시 후에 끝날 것입니다. 그러나 결국이 모든 것을 두 배로 늘리기를 원하기 때문에 이것을 원하지 않습니다. +=
그리고 대부분의 단지를 사용합니다.
어떤 아이디어?
[여기] (http://coliru.stacked-crooked.com/a/beaea40305a2119f)의 코드를 꽂으면 그 두 가지 사이에 ambuiguity가없는 것 같습니다 –