如何避免在模板类中重新定义typedef?

问题描述

我正在尝试创建一个类,该类根据传递给getter和setter还是仅指向要获取和设置的变量的指针来获取和设置。这个想法是,当使用指针参数构造TGetter和TSetter成员时,它们认为chars并且不执行任何操作。如果使用setter和getter构造函数调用它,则指向变量的指针认为char,并且不执行任何操作。我试图将std :: enable_if与typedefs一起使用来确定T是什么,但是我得到了多个定义:

template <typename TGetter = char,typename TSetter = char,typename Tptr = char> 
struct GetterSetter  
    // IF THE PTR CONSTRUCTOR IS CALLED THEN I WANT T TO BE THE TYPE OF TGetter() called result.
    // IF THE GETTER AND SETTER CONSTRUCTOR IS CALLED I WANT T TO BE THE TYPE OF
    // T DEREFERENCED
{
    typedef std::enable_if<std::is_same_v<Tptr,char>,std::invoke_result_t<TGetter>> T;
    typedef std::enable_if < std::is_same_v<TGetter,std::remove_pointer_t<Tptr>> T;
    

    GetterSetter(TGetter getter,TSetter setter) : getter(getter),setter(setter) {}
    GetterSetter(Tptr ptr) : ptrToT(ptr) {}

    TGetter getter;
    TSetter setter;
    Tptr ptrToT;

    T get()
    {
        if constexpr (std::is_same_v<Tptr,char>) return *ptrToT;
        else return getter();
    }

    void set(T t)
    {
        if constexpr (std::is_same_v<Tptr,char>) *ptrToT = t;
        else setter(t);
    }
};

如何防止这种情况?我根本没有实例化该类,并且遇到了重新定义编译器错误

解决方法

您不能使用std::enable_if有条件地选择typedef。为此,您可以编写:

typedef std::conditional_t<std::is_same_v<TGetter,char>,std::remove_pointer_t<Tptr>,std::invoke_result_t<TGetter>> T;

或更可取的是:

using T = std::conditional_t<std::is_same_v<TGetter,std::invoke_result_t<TGetter>>;

假设T必须是两种类型之一。