gpt4 book ai didi

c++ - 我可以为缺少的模板成员类型创建默认类型吗?

转载 作者:太空狗 更新时间:2023-10-29 21:43:57 24 4
gpt4 key购买 nike

如果我有一个带有模板参数的算法,比如

struct DemoParameters
{
typedef float Price;
typedef std :: list <Price> Prices;
}

template <typename Parameters>
void foo (int arg)
{
typename Parameters :: Prices prices = ...;
// blah
}

foo <DemoParameters> (123);

有没有办法让我写foo这样如果 Parameters 中缺少某些内容我可以提供默认值。例如

struct PartialParameters
{
typedef float Price;
// Prices is missing
}

template <typename Parameters>
void foo (int arg)
{
Prices_type<Parameters>::type prices = ...;
}

foo<DemoParameters> (123); // will use list<Price>
foo<PartialParameters> (123); // will use vector<Price>

在哪里Prices_type<Parameters>::typeParameters::Prices如果PricesParameters 的成员, 或 std::vector<Parameters::Price>否则。

这可能吗?

最佳答案

这被命名为 SFINAE :

#include <iostream>

struct Foo {
using Type = int;
};
struct Bar {
};

template <typename T, typename Default >
struct TypeOrDefault {
template <typename U>
static auto call( int ) -> typename U::Type;

template <typename U>
static auto call(...) -> Default;

using type = decltype( call<T>( 1 ) );
};

int main() {
std::cout << std::is_same<int,typename TypeOrDefault<Foo,float>::type > ::value << std::endl;
std::cout << std::is_same<int,typename TypeOrDefault<Bar,float>::type > ::value << std::endl;
}

上面的例子给出了 TypeOrDefaulttype 类型成员,Foo 为 int,Bar 为 float。

您还可以使用模板别名简化语法。

template < typename T, typename Default >
using TypeOrDefaultType = typename TypeOrDefault<T,Default>::type;

然后

int main() {
std::cout << std::is_same<int,TypeOrDefaultType<Foo,float> > ::value << std::endl;
std::cout << std::is_same<int,TypeOrDefaultType<Bar,float> > ::value << std::endl;
}

关于c++ - 我可以为缺少的模板成员类型创建默认类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21529103/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com