有什么方法可以部分实例一个C 模板
is there any way to partial instance a c++ template
我有某种类型的模板,模板中的某些代码对所有类型都不有效,因此我想在需要时跳过它们。
struct T1
{
int getData(){return 1;}
};
struct T2
{
string getData(){return "string";}
};
struct T3
{
// no getData()
};
template<typename T>
void printData(T param)
{
cout << param.getData() << endl;
}
int main() {
T1 t1;
T2 t2;
T3 t3;
printData(t1);
printData(t2);
printData(t3); // fails for T3 has no getData
}
我想知道有这样的方法(伪代码):
template<typename T>
void printData(T param)
{
if(T != T3) // compile time check, instance on this condition
{
cout << param.getData() << endl;
}
}
我尝试过std::is_same
,但它不起作用
从C 17开始,您可以使用 if constexpr (!std::is_same_v<T, T3>)
,如Songyuanyao的答案中所建议的。
在C 11/C 14 i提出两种方式。
(1)标签派遣
template <typename T>
void printData (T param, std::true_type)
{ }
template <typename T>
void printData (T param, std::false_type)
{ std::cout << param.getData() << std::endl; }
template <typename T>
void printData (T param)
{ printData(param, std::is_same<T, T3>{}); }
(2)sfinae
// ever enabled
template <typename T>
void printData (T param, long)
{ }
// preferred (int instead of long) but enabled only
// when param support getData()
template <typename T>
auto printData (T param, int)
-> decltype( param.getData(), void() )
{ std::cout << param.getData() << std::endl; }
template <typename T>
void printData (T param)
{ printData(param, 0); }
问题是,当T
为T3
时,语句_true仍将在汇编中进行评估,这导致汇编错误。
您可以使用constexpr(自C 17)。
如果该值为
true
,则丢弃语句 - false(如果存在),则丢弃语句 - 真实。
,例如
if constexpr (!std::is_same_v<T, T3>)
{
cout << param.getData() << endl;
}
相关文章:
- 如何在c++17中制作一个模板包装器/装饰器
- 在一个模板函数中,若输入的类型是enum类,我该如何使用std::underlying_type
- 如果有一个模板构造函数只有一个泛型参数,为什么我必须有一个复制构造函数
- 如何将模板的实例传递给另一个模板的另一个实例?
- 如果模板参数是另一个模板的实例化,则键入特征测试
- 在 C++ 中将一个模板类型的对象类型转换为另一个模板类型
- 具有多个参数的模板化类专用化,其中一个模板参数是模板本身
- 一个模板方法,用于同时接受常量和非常量参数
- 如何使模板化类成为另一个模板化类的好友
- 使用当前模板作为其中一个模板参数的模板参数
- 通过将其中一个模板更改为 muliset 后,我可以在 PBDS 排序集上使用计数功能<int>less_equal<int>
- 如何创建一个模板化函数,可以在任何具有字符串键的 std::map 上运行?
- 如何使用另一个模板化类的实例模板化类?
- 如何检查一个模板是否是另一个模板的类成员
- 我已经创建了一个模板函数,但是在检查输入是奇数还是偶数时收到错误 C++.
- 是否可以有一个模板函数,可以将向量和非向量类型都作为参数
- 如何将模板化类实例作为模板参数传递给另一个模板?
- C++模板:无法匹配可变参数类模板中的最后一个模板
- 为什么 std::分配器是一个模板?
- 当类是另一个模板的模板参数时,可以使用类模板参数推断吗?