在函数参数中指定名称空间C++

发布于 2025-01-17 11:09:41 字数 484 浏览 0 评论 0原文

如何指定通过在C ++(Arduino)中传递函数参数中使用的命名空间。

目的是根据程序正在运行的模式选择名称空间。当然,模式可能在运行时发生变化。

namespace A{
 void init(){}
 void run(){}
}

namespace B{
 void init(){}
 void run(){}
}

void function2(namespace X) { // this does not work.
 X::init();
 X::run();
}

void loop(){
 // mode is defined elsewhere (actually a switch function is used)
 if (mode == "A") {
  function2(A);
 } else if (mode == "B") {
  function2(B);
 }
}

How to specify which namespace used by passing in function argument in C++ (arduino)

The objective is to select a namespace depending on the mode the program is running. Of course, the mode may change at runtime.

namespace A{
 void init(){}
 void run(){}
}

namespace B{
 void init(){}
 void run(){}
}

void function2(namespace X) { // this does not work.
 X::init();
 X::run();
}

void loop(){
 // mode is defined elsewhere (actually a switch function is used)
 if (mode == "A") {
  function2(A);
 } else if (mode == "B") {
  function2(B);
 }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

坐在坟头思考人生 2025-01-24 11:09:41

您不能将命名空间传递给函数(或方法)。

但您可以传递指向函数或方法的指针,如下所示:

#include <iostream>

namespace A {
    void print() {
        std::cout << __PRETTY_FUNCTION__ << std::endl;
    }
}

namespace B {
    void print() {
        std::cout << __PRETTY_FUNCTION__ << std::endl;
    }
}

void function(void (*print)()) {
    print();
}

int main() {
    function(A::print);
    function(B::print);
}

注意:__PRETTY_FUNCTION__ 是一个 GCC 扩展,可扩展为当前函数或方法的漂亮字符串名称。

You cannot pass a namespace to a function (or method).

But you can pass a pointer to a function or method, like this:

#include <iostream>

namespace A {
    void print() {
        std::cout << __PRETTY_FUNCTION__ << std::endl;
    }
}

namespace B {
    void print() {
        std::cout << __PRETTY_FUNCTION__ << std::endl;
    }
}

void function(void (*print)()) {
    print();
}

int main() {
    function(A::print);
    function(B::print);
}

Note: __PRETTY_FUNCTION__ is a GCC extension that expands to the pretty string name of the current function or method.

野稚 2025-01-24 11:09:41

您可以在 C 中使用宏,如下

#define function2(x)  { using namespace x ; print();}

完整源代码:

#include <iostream>
using namespace std;

namespace A{
 void print(){
     cout << "namespace A\n";
 }
}

namespace B{
 void print(){
    cout << "namespace B\n";
 }
}
#define function2(x)  { using namespace x ; print();}

int main(){

    function2(A);
    function2(B);
}

在以下位置进行测试: https://godbolt.org/z/raq8Ks9cM< /a>

you can use macro in C like this

#define function2(x)  { using namespace x ; print();}

full source:

#include <iostream>
using namespace std;

namespace A{
 void print(){
     cout << "namespace A\n";
 }
}

namespace B{
 void print(){
    cout << "namespace B\n";
 }
}
#define function2(x)  { using namespace x ; print();}

int main(){

    function2(A);
    function2(B);
}

tested at : https://godbolt.org/z/raq8Ks9cM

送君千里 2025-01-24 11:09:41

像您在示例中一样,具有指定名称空间的函数参数是无效的。来自::

默认情况下,声明为函数参数的变量具有自动存储持续时间。

但是,存储持续时间的概念仅适用于对象。而且,由于名称空间不是对象(它们都不是对象),因此它们没有存储持续时间,因此您在程序中的语法不正确。也就是说,我们不能将命名空间作为函数参数传递。

相反,您可以将参数作为指向函数的指针,如下所示。

此外,请注意,void main()不是标准的C ++。相反,您应该使用int main(),如下所示。

#include <iostream>
namespace A{
 void print(){
     std::cout<<"A::print() called"<<std::endl;
 }
 void run(){
    std::cout<<"A::run() called"<<std::endl;
 }
}

namespace B{
 void print(){
     std::cout<<"B::print() called"<<std::endl;
 }
 void run(){
    std::cout<<"B::run() called"<<std::endl;
 }
}
//-------------vvvvvvvvvvvvvvv-------->function2 has a parameter named print that is a pointer to a function taking no parameters and with return type of void
void function2(void (*print)()) { 
 print();
}

int main(){//void main() changed to int main()
 function2(A::print);
 function2(A::run);
 
 function2(B::print);
 function2(B::run);
}

demo

It is not valid to have a function parameter specifying a namespace as you have in your example. From Storage class specifiers 7.1.1.2:

a variable declared as a function parameter has automatic storage duration by default.

But the concept of storage duration is applicable only to objects. And since namespaces are not objects(and neither are they types), they don't have storage duration and thus the syntax that you've in your program is incorrect. That is, we cannot pass a namespace as a function argument.

You can instead have a parameter as a pointer to a function as shown below.

Additionally, note that void main() is not standard C++. You should instead use int main() as shown below.

#include <iostream>
namespace A{
 void print(){
     std::cout<<"A::print() called"<<std::endl;
 }
 void run(){
    std::cout<<"A::run() called"<<std::endl;
 }
}

namespace B{
 void print(){
     std::cout<<"B::print() called"<<std::endl;
 }
 void run(){
    std::cout<<"B::run() called"<<std::endl;
 }
}
//-------------vvvvvvvvvvvvvvv-------->function2 has a parameter named print that is a pointer to a function taking no parameters and with return type of void
void function2(void (*print)()) { 
 print();
}

int main(){//void main() changed to int main()
 function2(A::print);
 function2(A::run);
 
 function2(B::print);
 function2(B::run);
}

Demo

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文