允许模板参数推导指针所指向的成员类型到方法的成员参数

时间:2017-07-22 09:37:04

标签: c++ templates pointer-to-member argument-deduction

我已经将以下方法作为一个小实验来确定是否可能:

template<typename dataT>
class DemographicNode
{
    //...
    template<typename varT>
    varT count(const varT dataT::* variable = &dataT::citizens) const {
        //...
    }
    //...
}

除了事实上,即使对此方法的调用将提供所需的所有编译时可用信息,这也不允许对varT进行模板参数推导,这是正常的。

在这种情况下,有没有办法启用模板参数推断?

我正在使用VC ++ 17。

修改 我必须通过以下方式调用它:

gameState.getCountries()[0]->getDemoGraphics().count<double>();

我想用这样的话来称呼它:

gameState.getCountries()[0]->getDemoGraphics().count();

1 个答案:

答案 0 :(得分:2)

如评论中所述,模板参数推导不适用于默认参数。

在这里,您只需为varT设置默认模板参数:

template<typename varT = decltype(dataT::citizens)>
varT count(const varT dataT::* variable = &dataT::citizens) const {

};

或者您可以为count()添加不带参数的重载:

template<typename dataT>
class DemographicNode {
public:
    // no more default argument here
    template<typename varT>
    varT count(const varT dataT::* variable) const {
    };

    // overload without parameters
    auto count() const {
        return count(&dataT::citizens);
    }
};