模板类规范的简化

时间:2012-03-09 02:13:45

标签: c++ visual-studio-2010 templates c++11 template-specialization

我对模板类的可能性很感兴趣。现在,我想知道如何实现以下目标:

    Const<5>::getValue();

目前我可以这样做:

    Const<int, 5>::getValue());

这就是班级的实施:

    template <typename T, T value>
    class Const {
    public:
        typedef T Type;

        static T getValue() {
            return value;
        }
    };

我知道这只是一个非常愚蠢的例子,但是一旦我能做到这一点,我可以简化以下行:

    Getter<int, TestClass, &TestClass::get> getter;

只是:

    Getter<&TestClass::get> getter;

那将是TestClass:

    class TestClass {
    private:
        int _value;
    public:
        int get() {
            return _value;
        }
    };

感谢您的帮助!

[EDIT-1]

关于J.N.是的,C ++ 11没问题。

关于Xeo,我尝试使用#define AUTO_ARG(x) decltype(x), x,但这在TestClass中不起作用。

[EDIT-2]

关于KennyTM,当我在TestClass中声明Getter<...> g时,它不适用于Getter<AUTO_ARG(&TestClass::get)>,它仅适用于Getter<int (TestClass::*)() const, &TestClass::get>

现在我想知道这只是Visual Studio中的一个错误???

1 个答案:

答案 0 :(得分:2)

您仍然可以使用@Xeo's link给出的AUTO_ARG(x)。如果需要获取返回类型或类类型,只需使用模式匹配(即模板特化):

template <typename T, T mem_fun_ptr>
struct Getter;

template <typename R, typename C, typename... A, R (C::*mem_fun_ptr)(A...) const>
struct Getter<R (C::*)(A...) const, mem_fun_ptr>
{
    typedef R return_type;
    typedef C class_type;
};

#define AUTO_ARG(x) decltype(x),(x)

class TestClass {
private:
    int _value;
public:
    int get() const {
        return _value;
    }
};

Getter<AUTO_ARG(&TestClass::get)> g;