C++ 在左值上调用用户定义的文字
有没有办法调用用户定义的左值文字 e、 g我想C++ 在左值上调用用户定义的文字,c++,c++11,user-defined-literals,C++,C++11,User Defined Literals,有没有办法调用用户定义的左值文字 e、 g我想 int operator "" _xor1(int a) { return a^1; } // Works fine 17_xor1; auto myint = get_something_only_availabe_at_runtime(); // Any way to use _xor1 on myint? _xor1(myint); // Doesn't work 此外,在编译器资源管理器中编译以下代码时,我惊讶地发现,虽然所有数据在
int operator "" _xor1(int a) { return a^1; }
// Works fine
17_xor1;
auto myint = get_something_only_availabe_at_runtime();
// Any way to use _xor1 on myint?
_xor1(myint); // Doesn't work
此外,在编译器资源管理器中编译以下代码时,我惊讶地发现,虽然所有数据在编译时都可用,但它在运行时已全部解析。为什么呢
constexpr int operator "" _xor1(unsigned long long a) {
return a^1;
}
int main() {
// This code resolves the user defined literal at runtime on gcc,
// msvc and clang - I don't see why I can't use the
// user defined literal at runtime?
return 17_xor1;
}
我不确定您是否真的想这样做-正如所评论的,您最好定义一个普通函数并调用它-但是您可以使用以下方法调用它:
运算符“”\uxor1(myInt);
有关详细信息,请参阅。否,您不能对运行时填充的变量调用用户定义的文字。你也不需要。只需定义一个独立函数,不同的代码段可以在需要时调用,例如:
template <typename T>
T do_xor1(T a) { return a^1; }
int operator "" _xor1(unsigned long long a) { return do_xor1(a); }
// Works fine
17_xor1;
auto myint = get_something_only_availabe_at_runtime();
do_xor1(myint);
模板
T do_xor1(ta){返回一个^1;}
int运算符“”xor1(无符号长a){return do_xor1(a);}
//很好
17_xor1;
auto myint=get_something_only_available_在_运行时();
doxor1(myint);
只定义一个名为的普通函数xor1
用户定义的文本也不能在右值上调用。它不是表达式修饰符。它在解析阶段被解析,语法是一个语法文字(概括来说,是一个字符、字符串、整数或浮动文字),后跟用户定义的文字后缀;解析的结果是一个用户定义的文本,它是一个表达式。您的请求有点像要求int foo(){return 1;}int main(){double d=foo().2;}
来生成1.2
,还请注意,如cppreference()中所述,int
不是用户定义的文本的有效参数-请改用无符号长整型int
。我认为这是更好的设计选项,但不是“不能对变量调用用户定义的文本”。我确实需要这样做。我有三个用户定义的文本运算符,它们都返回相同的用户定义类,用于简化编程。出于与此无关的原因,我需要(在运行时)将任意字符串转换为该类的实例。如果我可以告诉C++在运行时使用这些字符串的编译时逻辑,那么我就拥有我需要的大部分。相反,我必须手动从字符串中提取后缀,对它们的值运行switch语句,并显式选择要运行的三个运算符之一。没什么大不了的,但我宁愿用C++来做……(但是,我所说的是重用编译时逻辑来决定用户定义的文本操作符来调用什么,而你和ASKER所讨论的问题是重用一个用户定义的文字操作符的内容。所以我想我有点偏离主题。)哦,好吧,我已经说服自己将我的问题作为一个新问题提出:@mjwach“我需要(在运行时)将任意字符串转换为该类的实例”-为什么不将该字符串传递到该类的构造函数中,并让该类根据需要解析该字符串?如果字符串不是预期的格式,它可能引发异常。