假設A是某個類,我有以下帶有非型別引數的函式模板:
template <typename T, int v> void func(const T& x);
現在我希望對不同的型別有不同的實作,T例如我想要一個通用版本的funcfor 通用型別(通用意味著沒有func為其設計的特殊版本的型別)和一個與func類A不同的特殊版本的for一般版本。此外,此設計的用戶func通過以下方式呼叫:
func<int,9>(11);
func<A,1>(a); //a is an object of class A
我的問題是,鑒于函式模板不允許部分專門化并且多載func不允許用戶以 的方式呼叫它,我該func<A,1>如何正確實作func?
uj5u.com熱心網友回復:
只需讓型別系統為您完成作業:
#include <iostream>
class A {};
// Default implementation
template <typename T, int v> void func(const T& x)
{
std::cout << x v << "\n";
}
// Specialized for A
template <typename T, int v> void func(const A& x) //<-- matches A for argument T
{
std::cout << "Groovy " << v << "\n";
}
int main()
{
func<int, 9>(11);
func<double, 3>(0.14159);
func<const char*, 3>("uh oh!");
func<A, 1>(A());
}
輸出:
20
3.14159
oh!
Groovy 1
現場示例在這里
uj5u.com熱心網友回復:
您可以使用 C 20概念來做到這一點:
#include <concepts>
struct A {};
template <typename T, int v>
void func(const T& x) {
// general version
}
template <std::same_as<A> T, int v>
void func(const T& x) {
// special version
}
演示。
uj5u.com熱心網友回復:
你可以用std::enable_if做你想要什么為如下:
#include <iostream>
#include <iostream>
class A
{
};
template <typename T, int v> void func(const T&x) //primary template
{
std::cout<<"primary template"<<std::endl;
}
template <typename T,int v, typename = std::enable_if<std::is_same<T, A>::value>> void func(const A&x)
{
std::cout<<"choosen for A"<<std::endl;
}
int main()
{
A a;
func<int, 9>(11); //prints primary template
func<A, 9>(a); //prints choosen for A
return 0;
}
盡管稻田的回答綽綽有余。此外,上述版本允許撰寫func<void, 9, int*>(a);您可能不想要的內容。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/347511.html
上一篇:使用SpringBoot REST應用程式出現404錯誤
下一篇:模板型別擦除
