我有一個模板,旨在采用 int、float、double、char 和 std::string。我想要一個方法只在模板型別名是std::string
這可能嗎?
uj5u.com熱心網友回復:
如果您可以使用 C 20,則可以requires在所需方法上使用運算式,使其僅在某些情況下可用。
#include <iostream>
#include <string>
#include <concepts>
template<class T>
struct Foo
{
void alwaysAvailable() { std::cout << "Always available\n"; }
void conditionallyAvailable() requires std::same_as<T, std::string>
{
std::cout << "T is std::string\n";
}
};
int main()
{
Foo<int> fooInt;
fooInt.alwaysAvailable();
//fooInt.conditionallyAvailable(); // Constraint not satisfied
Foo<std::string> fooString;
fooString.alwaysAvailable();
fooString.conditionallyAvailable();
}
Foo<T>::alwaysAvailable顧名思義,無論是什么,它始終可用T。Foo<T>::conditionallyAvailable僅在Tis時可用std::string。
演示在這里
C 17 版本有點丑。我們必須制作conditionallyAvailable一個方法模板,然后在方法上放置一些 SFINAE 約束:
#include <type_traits>
template<class T>
struct Foo
{
void alwaysAvailable() { std::cout << "Always available\n"; }
template<class U = T>
std::enable_if_t<std::is_same_v<U, T> && std::is_same_v<U, std::string>, void> conditionallyAvailable()
{
std::cout << "T is std::string\n";
}
};
演示在這里
C 14 和 C 11 版本與 C 17 版本類似,只是需要擴展enable_if_t和is_same_v.
uj5u.com熱心網友回復:
使用 SFINAE 和型別特征來實作這種功能。編譯器將簡單地丟棄其他候選函式。由于 C 11 enable_if 是 SFINAE 之上的包裝器,如果您可以訪問 C 11 及更高版本的支持,則可以直接使用 enable_if
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/385149.html
上一篇:如何通過API為Facebook營銷活動付費以運行通過FB營銷API創建的廣告?
下一篇:std::tuple的笛卡爾積
