问题描述
我正在尝试创建一个类,该类根据传递给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
必须是两种类型之一。