如何在调用时减少模板参数的数量?

时间:2014-06-10 16:46:50

标签: c++ templates

我有一个模板函数,其成员函数指针作为模板参数

template<
    class Object,
    class Property,
    void (Object::*setProperty)(Property const&)
>
void f(Object& object, Property const& property)

每次,我都必须使用3个模板参数调用该函数,如下所示

f<A, Value, &A::setValue>(a, value);

通过使用tempalte参数派生或其他技术来减少模板参数数量的方法

f<&A::setValue>(a, value)

1 个答案:

答案 0 :(得分:4)

我的第一个想法是“不”,但后来我意识到有一种奇怪的方式:

template<class Object, class Property>
struct APointlessName { //needs a better name, but I can't think of one right away
    APointlessName(Object& object, Property const& property)
    :object(&object), property(&property)
    {}

    template<void (Object::*setProperty)(Property const&)>
    void with() 
    {
        Object& object = *(this->object);
        Property const& property= *(this->property);
        //your function code goes here
    }

    Object* object;
    Property const* property;
};
template< class Object, class Property>
APointlessName<Object,Property> f(Object& object, Property const& property)
{return APointlessName<Object,Property>(object, property);}

然后用法就是这样:

f(a, value).with<&A::setValue>();

绝对有点奇怪,但确实避免了显式类型。希望其他人想到更好的方式。