又一个模板问题!我正在尝试获取一个模板方法,如果它有一个运算符<<的重载,它将输出一个对象.我几乎都在工作,并实现了一个enable_if,以使g ++为每种类型的对象选择预期的专业化.
事情是,对于非重载对象,它工作得很好.但是对于一个超载的,我的两个专业都是g ++的合理选择,而不是编译它输出一个模糊的重载错误.
这是代码:
template<typename T>
static void Print(Stream& out, T& param, typename enable_if<CanPrint<T>::value>::type = 0)
{
out << param;
}
template<typename T>
static void Print(Stream& out, T& param)
{
out << "/!\\" << typeid(param).name() << " does not have any overload for <<.\n";
}
Run Code Online (Sandbox Code Playgroud)
我理解为什么这样的事情是模棱两可的.然而,我想不出一种方法可以让它变得更加明显......我如何让编译器明白第二次重载只有在第一次不能被选中时才会被选中?
我有一个针对某些结构的辅助基类,它使用 CRTP 来帮助我获取有关它们的一些信息:
template <class T>
struct MyHelper
{
size_t size() const { return sizeof(T); }
};
Run Code Online (Sandbox Code Playgroud)
我已经在代码库的各个库中使用了使用此定义的结构,并且我希望有一种方法来记录它们。我的第一个想法是这样的:
template <class T>
struct MyHelper
{
size_t size() const { return sizeof(T); }
virtual void print(std::ostream& out) const { out << "(" << sizeof(T) << ")"; }
};
Run Code Online (Sandbox Code Playgroud)
但后来我意识到这行不通,原因有几个 - 其中之一是添加虚拟实际上改变了 POD 数据的大小。
有没有办法在没有 virtual 关键字的情况下让我拥有一个使用上述实现的默认 toStr 方法,除非特定的派生类 T 有一个实现,在这种情况下它会遵循该实现?
或者,trait 是否可能是指利用元功能的特定方式?
如果他们不是同义词,请点我的一些例子特质不属于元函数或那些元功能不属于特质。一段实际工作的代码,也许在 STL 或 Boost 库中,将受到赞赏,而不是一个人为的玩具示例。
我想看看 C++ 编程领域的专家如何使用这些术语。我不确定它们是否有权威的定义......
提前致谢!
澄清:我并不是在寻找任何特征或元功能的例子。在我的日常工作中,我一直在使用其中的数十个(如果不是数百个)。
我用struct中的enum编写了一个基本的C++模板元编程演示来计算fibonacci,它不能在GCC 4.9或MSVC 14上编译.
#include <iostream>
using namespace std;
template <int N>
struct fib {
enum {val = fib<N-1>::val + fib<N-2>::val};
};
template <>
struct fib<1> {
enum {val = 1};
};
template<>
struct fib<2> {
enum {val =2};
};
int main() {
// error: 'val' in 'struct fib<4>' does not name a type
struct fib<4>::val;
// expected ';' before 'struct
// expected primary-expression before '<<' token
cout << struct fib<40>::val;
cout << fib<40>::val; // works
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我知道这是声明结构实例的"C方式",并且在C++中建议抛弃"struct"关键字并将其声明为声明一个类实例.但是由于支持struct并且语法struct …
我需要使一个函数只取每个std::pair传递给它的参数的第一个值.传递的非类型值std::pair将不加改变地使用.我的以下解决方案仅适用于带有两个参数的函数.我需要知道如何将它推广到传递的任意数量的参数.
#include <type_traits>
template <typename T, typename = void>
struct has_first_type : std::false_type { };
template <typename T>
struct has_first_type<T, std::void_t<typename T::first_type>> : std::true_type { };
template <typename R, typename T, typename U, typename = void> struct act_on_first;
template <typename R, typename T, typename U>
struct act_on_first<R, T, U, std::enable_if_t<has_first_type<T>::value && has_first_type<U>::value>> {
template <typename F>
static R execute (const T& t, const U& u, F f) {
return f(t.first, u.first);
}
};
template <typename R, …Run Code Online (Sandbox Code Playgroud) c++ function template-meta-programming variadic-templates c++17
考虑到一个名为模板参数B的类型是C<D>(在实例化),我怎么能构建C<A>从B?
这是我的代码中的最小化提取:
template<typename A>
class foo {
template<typename B> // B is guaranteed to always be of the form C<D>
// How to write a function here with return type C<A>?
}
Run Code Online (Sandbox Code Playgroud) 出于教育目的,我尝试创建一个std::integer_sequence并将其元素总结为参数包。我希望这很简单,并编写了下面的代码。
步骤 1:创建一组 add() 操作以正确处理同类的、基于整数的参数包。用add<0,1,2,3>()-call测试并工作。
第 2 步:在这一步中,我想将 astd::integer_sequence作为模板参数传递,以对序列中的整数求和。我失败了,请参阅注释掉的代码。
如何将 astd::integer_sequence作为模板参数传递?
一个错误消息是没有函数模板 total 的实例与调用匹配。为什么?我期望一个整数序列相当于一个int参数包。
另一条错误消息表示Args模板参数是非常量的。怎么会这样?我希望这是一个后续错误,但我在实验中经常看到这种错误组合。
我正在使用 Microsoft VC++ 2017 编译器。
#include <iostream>
#include <utility>
template <typename T>
T add(T first) {
return first;
}
template <typename T, typename ... Args>
T add(T car, Args... cdr) {
return car + add(cdr...);
}
template <int ... Args>
int total() {
return add(Args...);
}
int main(int argc, char** argv)
{
using …Run Code Online (Sandbox Code Playgroud) c++ template-meta-programming variadic-templates visual-studio-2017
是否有用于测试的通用模板/宏,例如。如果定义了名称,那么一些东西。如何is_transparent运作。
is_transparent使比较器透明std::set(即可以使用自定义类型查找/等)。它只需要定义为任何东西,例如。using is_transparent = void;
我希望为某些自定义类型做类似的事情,但理想情况下我会使用std或boost 中的某些东西(甚至是宏),或者我可以使用有关实现的指导。
问题是,如何根据限定名称测试类型是否定义(存在?)?
是否存在这种编译时计算可以使编译器陷入无限循环?
无限循环不会消耗不断增加的内存吗?或者它可能会因缺乏内存而停止。
是否有编译时映射的规范/参考实现,将类型映射到类型?
例如,我需要一个类型映射 fromIBar -> IFoo或 from int -> IFoo。
在编译时,我可以IFoo在给定IBar.
如何使用 C++17 解决这个问题?
编辑:这是一个使用结构的例子https://godbolt.org/z/EEvrYd9PE
c++ ×10
templates ×4
compile-time ×2
c++14 ×1
c++17 ×1
crtp ×1
function ×1
sfinae ×1
struct ×1
type-mapping ×1