是否可以根据模板参数的常量有条件地启用模板类的非const/const数据成员?

NFR*_*RCR 10 c++ templates c++11

是否可以根据模板参数的常量有条件地启用模板类的非const/const数据成员?或者可能有一些条件typedef?我想过将std :: enable_if与std :: is_const一起使用,但是我没有使用std :: is_not_const.

class A;

template <typename T>
class Test
{
    A& m_a; // If T != const.
    const A& m_a; // If T == const.
};
Run Code Online (Sandbox Code Playgroud)

请注意,总是T!= A.

jro*_*rok 12

是的,你可以使用std::conditional:

template <typename T>
class Test
{
    typename
    std::conditional<std::is_const<T>::value, const A&, A&>::type
    m_a;
};
Run Code Online (Sandbox Code Playgroud)


Tim*_*lds 5

是的,你可以这样做.该<type_traits>头有工具用于这一目的.

template <typename T>
class Test
{
    typename std::conditional<
        std::is_const<T>::value,
        typename std::add_const<A>::type,
        typename std::remove_const<A>::type
    >::type m_a;
};
Run Code Online (Sandbox Code Playgroud)

你甚至可以为此目的做一个帮手:

//T is type to modify
//S is source type to mimic
struct mimic_const<T, S>
{
public:
    typedef typename std::conditional<
        std::is_const<S>::value,
        typename std::add_const<T>::type,
        typename std::remove_const<T>::type
    >::type type;
};
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它:

template <typename T>
class Test
{
    typename mimic_const<A, T>::type m_a;
};
Run Code Online (Sandbox Code Playgroud)