내 last question에서 템플릿 특수화가 작동하는 데 큰 도움이되었습니다. 이제 약간의 확장이 필요합니다. 두 멤버 함수가 서로 다른 매개 변수 유형을 가지고,여러 가변 템플릿을 사용한 템플릿 전문화
class person
{
private:
std::string name_;
int age_;
public:
person(const std::string &name)
: name_(name), age_(56)
{}
void age(int a) { age_ = i; }
void name(const std::string &n) { name_ = n; }
};
특별한 점은 다음과 같습니다
int main()
{
// First specialization
holder_ext<person> h1;
holder_ext<person, &person::age> h2;
holder_ext<int> h3;
// Second specialization
holder_ext<person, &person::age, &person::name> h4;
}
내 클래스 사람은 다음과 같습니다 : 나는이 문을 두 전문화를 원한다. 그래서 나는 둘 다 같은 variadic 템플릿 멤버 함수를 사용할 수 없다. 나는 2 개의 다른 가변성 템플렛으로 그것을 시도했다. 하지만 그건 효과가 없습니다. 또한 멤버 함수의 기본값은 작동하지 않습니다.
아무에게도 좋은 힌트가 있습니까? 사전에 다시
template < class T, void (std::conditional<std::is_class<T>::value, T, struct dummy>::type::* ...FUNC)(int)> class holder;
template < class T, void (T::*FUNC)(int)>
class holder<T, FUNC>
{
public:
explicit holder() : setter(FUNC) { std::cout << "func\n"; }
private:
std::function<void (value_type&, int)> setter;
};
template < class T>
class holder<T>
{
public:
explicit holder() { std::cout << "plain\n"; }
};
감사 :
이 (Pubby 덕분에) 하나 개의 멤버 함수와 솔루션입니다!
추신 : 아니, 나는 "3, 4, 5 가지 구성원 기능과 관련이있다"고 이틀 만에 나오지 않겠습니까? ;-)
비슷한 변형을 시도했지만 어쩌면 정확히 동일한 변형을 시도하지 않았을 수도 있습니다. 그래서 나는 이것을 시도 할 것이다. – zussel