部分模板类特化与成员函数指针

4
我有以下可用的代码:
class person
{
private:
    int age_;
public:
    person() : age_(56) {}
    void age(int a) { age_ = i; }
}

template < class T, void (T::* ...FUNC)(int) > class holder;

template < class T, void (T::*FUNC)(int)>
class holder<T, FUNC>
{
public:
    typedef typename T::value_type value_type;
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"; }
};

int main()
{
    holder<person> h1;
    holder<person, &person::age> h2;

    // this does not work:
    holder<int> h3;
}

我知道对于int(或任何其他非类、结构体或联合类型),由于第二个模板参数中的expect成员函数,该代码不起作用。
我的问题是如何更改代码使其正常工作。我需要它以这种方式工作,以使我的holder类的使用变得简单。
我已经尝试过类型特征,并将成员函数指针移动到类的构造函数中,但没有成功。
有什么建议吗?提前感谢!

特质是前进的道路 - 它们有什么问题? - Björn Pollex
为了测试,我尝试使用enable_if来进行int类型的特化,但编译器总是提到第一个holder定义中缺少成员函数。 - zussel
1个回答

3
更新:我使用了std :: conditional,现在已经解决了问题。
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 class_holder
{
public:
    typedef typename T::value_type value_type;
public:
    explicit class_holder() : setter(FUNC) { std::cout << "func\n"; } 
protected:
    std::function<void (value_type&, int)> setter;
}

template <class T, bool IsClass = std::is_class<T>::value>
class holder;

template <class T>
class holder<T, true> : public class_holder<T>
{
public:
    template <void (T::*FUNC)(int) >
    class with_member : public class_holder<T, FUNC>
    {
    };
};

template <class T>
class holder<T, false>
{
public:
    explicit holder() { std::cout << "plain\n"; }
};

int main()
{
    holder<person> h1;
    holder<person>::with_member<&person::age> h2;
    holder<int> h3;
}

我还没有编译这个,如果有什么不起作用的地方,请告诉我。

@zussel 很高兴它起作用了!您可以点击左侧的复选标记将其标记为解决方案。 - Pubby
+1 我会点赞只是因为它有创意 =P 顺便问一下,T::value_type应该如何解决。我没有看到person有这样的特征。它从哪里来? - WhozCraig
@WhozCraig:这是我在 person 周围放置的一个类似 shared_ptr 的模板化指针类的剩余部分。指针类具有 typedef value_type。该示例中未使用它。我调整了解决方案,使其适用于我的指针类。 - zussel
@WhozCraig:我也花了几分钟才看出来关键是使用虚拟结构体。相当聪明! - zussel
@Pubby,struct dummy>::type::* ...FUNC 中的三个点号代表什么意思? - user3882729
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接