這個問題在這里已經有了答案: 替代使用命名空間作為模板引數 2 個答案 15 小時前關閉。
有沒有辦法使用命名空間作為模板?我需要從不同的命名空間呼叫相同的函式。
類似的東西:這里有兩個名稱空間myNamespace1, myNamespace2包含一個同名的函式 -func()
#include <iostream>
using namespace std;
namespace myNamespace1 {
void func()
{
std::cout<<"myNamespace1" << std::endl;
}
}
namespace myNamespace2 {
void func()
{
std::cout<<"myNamespace2" << std::endl;
}
}
template<auto T>
class A {
public:
void func()
{
T::func();
}
};
}
int main() {
using namespace myNamespace1;
using namespace myNamespace2;
A<myNamespace1> a1;
a1.func(); // output: myNamespace1
A<myNamespace2> a2;
a2.func(); // output: myNamespace2
return 0;
}
uj5u.com熱心網友回復:
命名空間不能用作模板引數。但是您可以使用例如表示函式的非型別模板引數,例如
#include <iostream>
namespace myNamespace1 {
void func()
{
std::cout << "myNamespace1" << std::endl;
}
}
namespace myNamespace2 {
void func()
{
std::cout << "myNamespace2" << std::endl;
}
}
template<void ( &Func )()>
class A {
public:
void func()
{
Func();
}
};
int main()
{
A<myNamespace1::func> a1;
a1.func();
A<myNamespace2::func> a2;
a2.func();
}
程式輸出為
myNamespace1
myNamespace2
uj5u.com熱心網友回復:
您可以創建標記類:
class myNamespace1Tag {};
class myNamespace2Tag {};
template<typename T>
using A_in = std::conditional_t<std::is_same_v<T, myNamespace1Tag>, myNamespace1::A, std::conditional_t<std::is_same_v<T, myNamespace2Tag>, myNamespace2::A, void>;
A_in<myNamespace1Tag> a1;
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/513856.html
上一篇:使用Makefile多輸出檔案
