Scott Meyers发表了他的下一本书EC ++ 11的内容和状态 。 他写道,书中的一个项目可能是“避免函数签名中的std :: enable_if”。 std::enable_if可以用作函数参数,作为返回types或作为类模板或函数模板参数来有条件地从重载parsing中移除函数或类。 在这个问题中,所有三个解决scheme都显示 作为函数参数: template<typename T> struct Check1 { template<typename U = T> U read(typename std::enable_if< std::is_same<U, int>::value >::type* = 0) { return 42; } template<typename U = T> U read(typename std::enable_if< std::is_same<U, double>::value >::type* = 0) { return 3.14; } }; 作为模板参数: template<typename T> struct Check2 { […]
我有一个多个类,每个都有不同的成员variables,在构造函数中被初始化。 这里是一个例子: struct Person { Person(const char *name, int age) : name(name), age(age) { } private: const char *name; int age; }; 每个都有一个关联的print<>()函数。 template <> void print<Person>(const Person &person) { std::cout << "name=" << name << "\n"; std::cout << "age=" << age << "\n"; } 这个代码很容易出错,因为参数列表被复制到四个地方。 如何重写代码以避免重复? 我想使用预处理器和/或模板。 例如,我可以使用X-args预处理器技术 – 像这样? #define ARGUMENTS \ ARG(const […]
我想知道为什么下面的代码不能编译: struct S { template <typename… T> S(T…, int); }; S c{0, 0}; 这段代码无法使用clang和GCC 4.8进行编译。 这是clang的错误: test.cpp:7:3: error: no matching constructor for initialization of 'S' S c{0, 0}; ^~~~~~~ test.cpp:4:5: note: candidate constructor not viable: requires 1 argument, but 2 were provided S(T…, int); ^ 在我看来,这应该起作用,而T应该被推断为是一包长度为1的包。 如果标准禁止这样做,有没有人知道为什么?
以下代码: template <typename S, typename T> struct foo { void bar(); }; template <typename T> void foo <int, T>::bar() { } 给我的错误 invalid use of incomplete type 'struct foo<int, T>' declaration of 'struct foo<int, T>' (我正在使用gcc。)我的部分专业化的语法是错误的? 请注意,如果我删除第二个参数: template <typename S> struct foo { void bar(); }; template <> void foo <int>::bar() { } 那么它编译正确。
我编写了这个C ++ 11 trait模板来检查一个types是否完整: template <typename…> using void_t = void; template <typename T, typename = void> struct is_complete : std::false_type {}; template <typename T> struct is_complete<T, void_t<decltype(sizeof(T))>> : std::true_type {}; 并像这样testing它: struct Complete {}; int main() { std::cout << is_complete<Complete>::value << is_complete<class Incomplete>::value << '\n'; } 我期望testing程序打印10 ,这是我得到的输出,当我编译与叮当3.4。 但是,使用gcc 4.9编译时,它会打印11字符 – 错误地将class Incomplete完整的class Incomplete识别为完整的。 我不知道我的代码是否正确,但在我看来,即使它是错误的,它应该在两个编译器上performance相同。 […]
我有一个函数声明如下: template <typename T> T read(); 并定义如下: template <typename T> T packetreader::read() { offset += sizeof(T); return *(T*)(buf+offset-sizeof(T)); } 但是,当我尝试在我的main()函数中使用它时: packetreader reader; reader.read<int>(); 我从g ++得到以下错误: g++ -o main main.o packet.o main.o: In function `main': main.cpp:(.text+0xcc): undefined reference to `int packetreader::read<int>()' collect2: ld returned 1 exit status make: *** [main] Error 1 任何人都可以指出我正确的方向?
我有一个抽象类(我知道它不会以这种方式编译,但它是为了理解我想要做的): class AbstractComputation { public: template <class T> virtual void setData(std::string id, T data); template <class T> virtual T getData(std::string id); }; class Computation : public AbstractComputation { public: template <class T> void setData(std::string id, T data); template <class T> T getData(std::string id, T data); }; 所以当我调用setData<double>("foodouble", data)我想把double确定的foodouble (这里不是主要关心的内部机制)设置为double数据。 那么该怎么做? 我认为有可能是通过键入类似virtual void setData<double>(std::string id, double […]
我见过以下与我的问题有关的线程: WPFcombobox:禁用时的背景颜色 以上处理更改ComboBox的内容模板。 我正在使用WPF,对样式和模板有些新颖,我想将禁用的TextBox的暗灰色背景颜色更改为其他颜色。 我们经常在我们的应用程序中使用TextBoxes ,我们发现默认的颜色设置难以阅读。 我已经制定了以下解决scheme尝试。 但当然,这是行不通的。 有人可以给我一个意见,为什么?
在HTML中,我可以通过提供一个stringforms的模板来构build一个简单的模板系统,replace它的一些部分,然后使用innerHTML将其分配给某个容器。 var templ = '<span>{myText}</span>' var newContent = templ.replace( '{myText}', someVariable ); document.querySelector( '#myContainer' ).innerHTML = newContent; 这样我可以利用浏览器的HTMLparsing器,而不必重复使用document.createElement() 。 如果模板增长超过几个元素,后者可能非常麻烦。 然而,在SVG中,作为innerHTML的元素,甚至innerSVG都没有这个属性。 所以我的问题是: 有没有什么我可以在SVG中使用ro类似于上面的例子的方法,或者我坚持document.createElement() (或者respectivly一些使用它的lib)? 与我的问题一样:Vanilla JavaScript解决scheme是首选,但任何指向提供解决scheme的lib指针表示赞赏。
考虑以下简单的问题(以模板问题为例): #include <iostream> template <typename T> struct identity; template <> struct identity<int> { using type = int; }; template<typename T> void bar(T, T ) { std::cout << "a\n"; } template<typename T> void bar(T, typename identity<T>::type) { std::cout << "b\n"; } int main () { bar(0, 0); } clang和gcc都在那里打印“a”。 根据[temp.deduct.partial]和[temp.func.order]中的规则,为了确定偏序,我们需要综合一些独特的types。 所以我们有两次尝试: +—+——————————-+——————————————-+ | | Parameters | […]